J'ai un objet comme ci-dessous, dans l'objet ci-dessous, je sauvegarde les préférences comme vrai / faux Maintenant, je souhaite mettre à jour le statut pour tous à la fois soit vrai / faux pour des cas tels que cochés tout ou non coché tous.
obj = {
a:false,
b:{
c:{
e:{
f:false,
g:true,
},
h:{
i:false,
j:true,
}
}
},
k:{
l:false,
m:false
},
n:true
}
3 Réponses :
Une fonction récursive fera en effet de faire ce dont vous avez besoin, cela pourrait ressembler à ceci:
p>
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)Pas exactement sûr où vous êtes coincé, mais cela devrait faire:
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);
Pour les tableaux très profonds, l'approche directe peut être lente, J'ai pensé à une façon de le faire avec String Remplacer à la place.
p>
const obj = {
a:false,
b:{
c:{
e:{
f:false,
g:true,
},
h:{
i:false,
j:true,
}
}
},
k:{
l:false,
m:false
},
n:true
};
function checkAll(obj,state = true) {
const regex = state ? /true/gi : /false/gi;
const changeTo = state ? 'false' : 'true';
// the magic, using string replace to set all at once
return JSON.parse(JSON.stringify(obj).replace(regex, changeTo));
}
function uncheckAll(obj) {
return checkAll(obj,false);
}
console.log(checkAll(obj));
console.log(uncheckAll(obj));
Veuillez fournir exemple de reproductible minimal