是否可以使用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()
它,但这看起来很混乱。
有什么建议吗?
答案 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;
}
通过传入新值,根对象然后传入任意数量的键来调用它。它将遍历键,直到它到达最后一个键,然后将其设置为您想要的值。这是相当粗糙的,可能需要一些额外的错误检查来测试密钥的存在(或不存在)。
答案 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)