我需要一个函数来设置嵌套对象属性的值。对象路径是一个数组,我似乎无法弄清楚如何缩小数组,以便它正确映射到对象。
这就是我所拥有的:
var store = {
config: {
default: {
value: 'foo'
}
}
};
function setValue({ object, objectPath, value } = {}) {
properties = objectPath.reduce((acc, prop) => {
acc[prop];
return store[acc];
});
};
setValue({
object: 'config',
objectPath: [ 'default', 'value' ],
value: 'bar'
});
答案 0 :(得分:2)
要实际设置一个值,您将要使用除最后一个路径元素以外的所有元素进行导航,并为实际值分配保存最后一个。
在化简器中,应将累加器初始化为顶级对象,并在运行时返回每个匹配的对象,以便最终的返回值是最里面的对象。
例如
var store = {
config: {
default: {
value: 'foo'
}
}
};
function setValue({ object, objectPath, value } = {}) {
// create a navigation path using the initial store key "object" and
// the objectPath minus the last element
let navigate = [object, ...objectPath.slice(0, -1)]
// reduce to find / create the store[nav0][nav1][nav2]... element
let valueObj = navigate.reduce((obj, prop) => {
// create an empty object if required
if (typeof obj[prop] !== 'object') {
obj[prop] = Object.create(null)
}
return obj[prop]
}, store)
// set the value
valueObj[objectPath[objectPath.length - 1]] = value
};
setValue({
object: 'config',
objectPath: [ 'default', 'value' ],
value: 'bar'
});
console.info(store)