有一个数组,一个值和一个带有嵌套对象的对象:

宾语

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不是nullundefined,它就会返回当前keyobj,它成为下一个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/

10-11 22:45
查看更多