我有一个看起来像这样的JavaScript对象:
obj = {
person: {
male: true,
age: 10
},
state: {
quit: false,
rain: -3
},
game: {
settings: {
lang: 'en',
os: 'win',
ver: 10,
},
},
next: 55,
last: 10,
};
我想创建一个可用于设置obj值的函数,如下所示:
function updateObj( property /*: string[]*/, value /*: any*/ ) {
obj[property[0]][property[1]] = value; <-- How to generalize?
}
所以我可以做类似的事情:
updateObj( ['person', 'male'], false );
updateObj( ['state', 'rain'], 19 );
但是,如果属性参数长度不等于2,当前的实现将无法正常工作。这行代码如何:
obj[property[0]][property[1]] = value;
可以推广到与任何数组大小的属性一起使用吗?
答案 0 :(得分:2)
下面的方法{p}在下面的reduceRight中使用
// with reduceRight
function updateObj(prop, value) {
prop = prop.reverse()
prop.reduceRight((o, d, i) => i == 0 ? (o[d] = value): o[d] , obj)
}
// with Reduce (efficient than above)
function updateObj(prop, value) {
prop.reduce((o, d, i) => i == prop.length -1 ? (o[d] = value): o[d] , obj)
}
updateObj( ['person', 'male'], false );
updateObj( ['state', 'rain'], 19 );
答案 1 :(得分:1)
遍历属性部分,每获得一个嵌套对象:
function updateObj( property /*: string[]*/, value /*: any*/ ) {
var base = obj;
for (var i = 0; i < property.length - 1; i++) {
base = base[property[i]];
}
base[property[property.length - 1]] = value;
}
答案 2 :(得分:1)
您可以保存最后一个键,并通过获取键来缩小对象并返回最后一个对象引用。对于未给定的属性,请分配一个空对象。
最后获取最后一个键并分配值。
function updateObj(properties, value) {
var last = properties.pop();
properties.reduce((o, k) => o[k] = o[k] || {}, obj)[last] = value;
}
var obj = { person: { male: true, age: 10 }, state: { quit: false, rain: -3 }, game: { settings: { lang: 'en', os: 'win', ver: 10 }, }, next: 55, last: 10 };
updateObj(['person', 'male'], false);
updateObj(['state', 'rain'], 19);
updateObj(['banana', 'ware'], 'snakeoil');
console.log(obj);
.as-console-wrapper { max-height: 100% !important; top: 0; }