我试图创建一个能够设置某个对象值的函数,具有该属性的“路径”:
reflectionSet = function(obj, propString, value) {
var current = obj;
var splitted = propString.split('.');
splitted.forEach(function(k) {
current = current[k];
})
current = value;
}
var test = {
a: {
s: 'asd',
g: 'asasdasdd'
}
};
reflectionSet(test, 'a.g', "otherValue");
它应该成为:
{
a: {
s: 'asd',
g: 'otherValue'
}
}
不幸的是,这根本不起作用..谢谢
答案 0 :(得分:1)
您可以使用基于.
拆分属性,然后使用Array.prototype.reduce
,转到对象的最内部并按此更新
function reflectionSet(obj, propString, value) {
return propString.split(".").reduce(function(result, part, index, array) {
if (index === array.length - 1) {
result[part] = value;
return obj;
}
return result[part];
}, obj);
}
var test = {
a: {
s: 'asd',
g: 'asasdasdd'
}
};
console.log(reflectionSet(test, 'a.g', "otherValue"));
<强>输出强>
{
a: {
s: 'asd',
g: 'otherValue'
}
}
答案 1 :(得分:1)
你的功能的这个更正版本应该这样做。
reflectionSet = function(obj, prop, value) {
prop = prop.split('.');
var root = obj, i;
for(i=0; i<prop.length; i++) {
if(typeof root[prop[i]] == 'undefined') root[prop[i]] = {};
if(i === prop.length - 1) root[prop[i]] = value;
root = root[prop[i]];
}
return obj;
};
现在:
var test = { a: { s: 'asd', g: 'asasdasdd' } };
reflectionSet(test, 'a.g', "otherValue");
将返回{ a: { s: 'asd', g: 'otherValue' } }