将递归键的名称传递给对象引用

时间:2014-03-01 04:33:53

标签: javascript jquery arrays object

是否可以使用JavaScript或jQuery通过将多个键传递给函数来设置(并获取)某个多维对象的值?由于这句话可能没有意义,这里是我要完成的代码示例:

obj = {
    a:{
        a1:'a1',
        a2:'a2'
    },
    b:'b1',
    c:'c1'
};


function add_to_obj(key,value){
    obj[key] = value;
}

预期行为:

console.log(obj.a[b]); // 'b1'    
add_to_obj(b,'b1-new');
console.log(obj.a[b]); // 'b1-new'    

我想做什么:

function how_to_do_this( key1[key2], value){
    obj[key1][key2] = value;
}
console.log(obj.a.a1); // 'a1'
how_to_do_this("a.a1", "a1-new");
console.log(obj.a.a1); // 'a1-new'

第二种方法是如何完成的?可以有多个“图层”传递给参数,所以我试图想办法做到这一点。我的初期是通过分隔符然后split()它,但这看起来很混乱。

有什么建议吗?

3 个答案:

答案 0 :(得分:1)

以下是我的做法:

var deepSet = function(obj, props, val){
  var attr = obj;
  while(typeof props[1]==="string"){
    if(!attr[props[0]])
      attr[props[0]] = {};
    attr = attr[props.shift()];
  }
  attr[props[0]] = val;
  return obj;
};

var test = {term: {value: "foo"}};
console.log(deepSet(test, ["term", "value"], "bar"));
// {term: {value: "bar"}}

答案 1 :(得分:1)

这是另一种方法:

function how_to_do_this(value, root) {
    var objToSet = root;
    for (var i = 2; i < arguments.length - 1; i++) {
        objToSet = objToSet[arguments[i]];
    }
    objToSet[arguments[i]] = value;
}

通过传入新值,根对象然后传入任意数量的键来调用它。它将遍历键,直到它到达最后一个键,然后将其设置为您想要的值。这是相当粗糙的,可能需要一些额外的错误检查来测试密钥的存在(或不存在)。

请参阅:http://jsfiddle.net/5cb7y/

答案 2 :(得分:1)

你也可以像这样用来设置任何级别的值

        function setvalue(obj, path, value) {
            var parts = path.split('.');
            var o = obj;
            if (parts.length > 1) {
                for (var i = 0; i < parts.length - 1; i++) {
                    if (!o[parts[i]])
                        o[parts[i]] = {};
                    o = o[parts[i]];
                }
            }
            o[parts[parts.length - 1]] = value;
        }
        alert(obj.b); // 'b1'
        setvalue(obj, "b", "b1-new");
        alert(obj.b);
        setvalue(obj, "a.a1", "a1-new");
        alert(obj.a.a1)