使用数组,值和具有嵌套对象的对象:
对象
mesh
阵列
['options', 'range', 'x']
值
12.5
是否可以将其翻译为更新属性,例如
mesh.options.range.x = 12.5
尝试:
index = (obj, i) ->
obj[i]
arr.reduce(index, obj) = 12.5
更新
谢谢大家的优雅解决方案。
答案 0 :(得分:2)
使用.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
的{{1}},成为下一个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;
答案 1 :(得分:2)
以下是一般解决方案:
function setPropertyPath(obj, path, value) {
var o = obj;
for (var i = 0; i < path.length - 1; i++) {
o = o[path[i]];
}
o[path[path.length - 1]] = value;
}
用法:
var obj = { a: { b: { c: 0 } } };
setPropertyPath(obj, ['a', 'b', 'c'], 10);
console.log(obj.a.b.c); // prints '10'
答案 2 :(得分:0)
var mesh = {},
arr = ['options','range','x'],
value = 12.5;
mesh[arr[0]][arr[1]][arr[2]] = value;
答案 3 :(得分:0)
如果数组长度是静态的,请执行以下操作:
mesh[array[0]][array[1]][array[2]] = value;
然而,这有一个问题是javascript不会自动生成,所以如果你正在访问之前未定义的键值,你可能会遇到错误(如果没有定义mesh.options那么上面会抛出一个错误,因为你无法分配它)。要解决这个问题,你可以将它抽象为一个递归处理事物的函数:
function update_val(obj, array, val, prev) {
if (array.length == 0) {
obj = val;
return;
}
var cur = array.shift();
if(array.length == 0) {
obj[cur] = val;
return;
} else if (obj[cur] == undefined) {
obj[cur] = {};
}
update_val(obj[cur], array, val);
}