有很多解决方案可以检查/访问一个带有点符号字符串的对象文字,但我需要做的是根据点符号字符串设置一个对象文字。这是非常技术性的,为什么我需要这样做,如果不可行,我会提出一个不同的解决方案。
以下是我想做的事情:
var obj = {
'a': 1,
'b': 2,
'c': {
'nest': true
}
};
我想要一个可以这样工作的函数:
setDepth(obj, 'c.nest', false);
这会将obj改为:
var obj = {
'a': 1,
'b': 2,
'c': {
'nest': false
}
};
我已经尝试了一个小时但还未能找到一个好的解决方案。另一个帮助将非常感激!
答案 0 :(得分:6)
我的版本:
function setDepth(obj, path, value) {
var tags = path.split("."), len = tags.length - 1;
for (var i = 0; i < len; i++) {
obj = obj[tags[i]];
}
obj[tags[len]] = value;
}
答案 1 :(得分:2)
这是一种方法:
function setDepth(obj, path, value) {
var levels = path.split(".");
var curLevel = obj;
var i = 0;
while (i < levels.length-1) {
curLevel = curLevel[levels[i]];
i++;
}
curLevel[levels[levels.length-1]] = value;
}
答案 2 :(得分:2)
我修改了Elliot的答案,让它添加新节点(如果它们不存在)。
var settings = {};
function set(key, value) {
/**
* Dot notation loop: http://stackoverflow.com/a/10253459/607354
*/
var levels = key.split(".");
var curLevel = settings;
var i = 0;
while (i < levels.length-1) {
if(typeof curLevel[levels[i]] === 'undefined') {
curLevel[levels[i]] = {};
}
curLevel = curLevel[levels[i]];
i++;
}
curLevel[levels[levels.length-1]] = value;
return settings;
}
set('this.is.my.setting.key', true);
set('this.is.my.setting.key2', 'hello');
答案 3 :(得分:0)
就这样做:
new Function('_', 'val', '_.' + path + ' = val')(obj, value);
在你的情况下:
var obj = {
'a': 1,
'b': 2,
'c': {
'nest': true
}
};
new Function('_', 'val', '_.c.nest' + ' = val')(obj, false);