有一个数组,一个值和一个带有嵌套对象的对象:
宾语
mesh
数组
['options', 'range', 'x']
值
12.5
是否可以翻译此属性以更新属性,例如
mesh.options.range.x = 12.5
尝试:
index = (obj, i) ->
obj[i]
arr.reduce(index, obj) = 12.5
更新资料
谢谢大家的优雅解决方案。
最佳答案
实际上,使用.reduce()
很不错:
// current object----| |----current key
// v v
arr.reduce(function(obj, key) {
return obj == null ? obj : obj[key];
}, window.mesh);
// ^
// |-- initial object
您尝试使用
.reduce()
需要传递一个管理“累加”的功能。在这里,只要前一个
obj
不是null
或undefined
,它就会返回当前key
的obj
,它成为下一个obj
。然后,由于您需要分配一个值,因此您实际上要获取倒数第二个键的值。
var o = arr.slice(0,-1).reduce(function(obj, key) {
return obj == null ? obj : obj[key];
}, window.mesh);
然后检查其存在并使用
arr
中的最后一项进行分配。o && o[arr.pop()] = 12.5;
所有这些都可以抽象为一个函数,该函数根据传递的参数数量来执行一个或另一个函数。
function setFromArray(obj, arr, val) {
var keys = arguments.length < 3 ? arr.slice() : arr.slice(0, -1);
var o = keys.slice(0,-1).reduce(function(obj, key) {
return obj == null ? obj : obj[key];
}, window.mesh);
if (arguments.length < 3)
return o;
else
o && o[keys.pop()];
}
关于javascript - 通过数组中的属性查找对象,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23942825/