按数组中的属性查找对象

时间:2014-05-29 20:53:49

标签: javascript arrays

使用数组,值和具有嵌套对象的对象:

对象

mesh

阵列

['options', 'range', 'x']

12.5

是否可以将其翻译为更新属性,例如

mesh.options.range.x = 12.5

尝试:

index = (obj, i) ->
   obj[i]

arr.reduce(index, obj) = 12.5

更新

谢谢大家的优雅解决方案。

4 个答案:

答案 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不是nullundefined,它就会返回当前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'

JSBin

答案 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那么上面会抛出一个错误,因为你无法分配它)。要解决这个问题,你可以将它抽象为一个递归处理事物的函数:

http://jsfiddle.net/h4jVg/

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);
}