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

Javascript 将递归键的名称传递给对象引用,javascript,jquery,arrays,object,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

是否可以使用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()

有什么建议吗?

以下是我的建议:

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"}}

以下是另一种方法:

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;
}
函数如何执行此操作(值,根){
var objToSet=根;
for(var i=2;i
您可以通过传入新值、根对象以及所需的任意多个键来调用它。它将遍历这些键,直到到达最后一个键,然后将其设置为所需的值。这相当粗糙,可能需要一些额外的错误检查来测试密钥是否存在


请参阅:

您也可以像这样设置任何级别的值

        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)
函数设置值(对象、路径、值){
var parts=path.split('.');
var o=obj;
如果(零件长度>1){
对于(变量i=0;i
你要找的是我的行为吗?现在还不清楚您是只想设置现有的深层属性还是同时创建它们。请在函数中使用。然后你可以传递类似于
how_to_do_this(“a1 new”、“a”、“a1”)@enjoys是的!这正是我想要的那种函数。如果能深陷也不错,但这对我来说已经足够了。我很想看看其他的方法,但是谢谢你的帮助!这是设置deep属性,请参见示例。你能描述一下你所需要的是如何不同的吗?不,不是离题,我也更新了代码来反映这一点。如果您满意,请接受并投票:)?谢谢!我可能会将它稍微调整为
props=props.split('.')
,然后看看这是怎么回事