我有以下对象,在以下对象中,我将首选项保存为true / false 现在,我想一次更新所有状态,例如全部选中或全部未选中的情况下为是/否。
obj = {
a:false,
b:{
c:{
e:{
f:false,
g:true,
},
h:{
i:false,
j:true,
}
}
},
k:{
l:false,
m:false
},
n:true
}
我正在考虑使用递归函数,并且可以使用递归函数访问所有键的值 但是我需要最好的方法来更新状态。
答案 0 :(得分:2)
对于非常深的Array,直接方法可能会变慢, 我想到了一种使用字符串替换的方法。
orderby
无法告诉您它的性能如何,但是我认为无论数组有多深,复杂性都将保持不变。
答案 1 :(得分:1)
递归函数确实可以满足您的需求,它看起来像这样:
const obj = {
a:false,
b:{
c:{
e:{
f:false,
g:true,
},
h:{
i:false,
j:true,
}
}
},
k:{
l:false,
m:false
},
n:true
};
const setAllTo = (val, object) => Object.keys(object)
.reduce((prev, curr) => ({
...prev,
[curr]: typeof object[curr] === 'object' ?
setAllTo(val, object[curr]) : val
}), {})
const result = setAllTo(true, obj);
console.dir(result)
答案 2 :(得分:0)
不确定是否会卡住,但这应该可以做到:
function setState(obj, value) {
for (var prop in obj) {
if (obj.hasOwnProperty(prop)) {
if (typeof obj[prop] === 'object') {
setState(obj[prop], value);
} else {
obj[prop] = value;
}
}
}
}
setState(obj, true);
setState函数的第二个参数设置每个属性的值。 您可以使用循环来做到这一点,但我认为递归示例更为优雅。
您需要的是逐步解决此问题:
如果属性不是对象,则在else语句中我们假定它包含布尔值,因此我们只需为其分配真值即可。因此,该函数将一直运行到到达包含布尔值的所有属性为止。