0
votes

Comment puis-je mettre à jour les valeurs pour toutes les clés de l'objet imbriqué à la fois dans réagir JS?

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
}


1 commentaires

3 Réponses :


1
votes

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)


0 commentaires

0
votes

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);


0 commentaires

2
votes

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));


0 commentaires