4
votes

JavaScript: Comment copier quelques clés d'un objet imbriqué par déstructuration

Disons que j'ai un objet:

newObj = { 
      name: 'Luke',
      age: 12,
      one: '1',
      two: '2'
    };

Je veux une copie de cet objet sans certaines clés vers un nouvel objet de manière à ce que la sortie soit comme ci-dessous:

myObj = { 
  name: 'Luke',
  age: 12,
  height: '163cm',
  weight: '60kg',
  others: { one: '1', two: '2', three: '3'} // (Edited) Added one more key here :)
};

J'ai vu des exemples de destruction mais je voulais savoir si c'est possible avec des objets imbriqués. Est-ce que quelque chose comme ça est faisable en utilisant la déstructuration ou sinon quel serait le moyen le plus efficace de le faire.


3 commentaires

En avez-vous besoin pour n'importe quel niveau de profondeur ou pour une structure connue particulière, comme celle que vous avez décrite?


À partir de maintenant, la structure connue devrait être correcte. J'ai mis à jour ma question un peu. :)


Efficace en quoi?


3 Réponses :


5
votes

Une façon d'y parvenir avec une syntaxe de type destructure serait la suivante:

const myObj = { 
  name: 'Luke',
  age: 12,
  height: '163cm',
  weight: '60kg',
  others: { one: '1', two: '2', three : '3'}
};


const newObj = {
  /* Copy over values from "myObj" to equivalent keys in "newObj" */
  name : myObj.name,
  age : myObj.age,

  /* Spread keys "one" and "two" of the nested "others" object into "newObj" */
  ...({one, two} = myObj.others, {one, two})
}

console.log(newObj)


5 commentaires

Merci pour la réponse. Que faire si je n'ai besoin que de la clé «un» de l'objet imbriqué. Est-ce possible?


J'ai mis à jour la question. Pourriez-vous s'il vous plaît y jeter un œil :)


@Outlooker Vous pouvez peut-être remplacer ... myObj.others par ... ({one} = myObj.others, {one}) dans ce cas.


@Outlooker désolé loin - vient de mettre à jour la réponse à votre question mise à jour, cela aide-t-il?


@DacreDenny Certainement. Merci pour votre aide :)



2
votes

Pour l'objet de profondeur inconnue, vous pouvez essayer d'utiliser la récursivité.

  • Créez une fonction qui prend un objet et un tableau de clés à supprimer comme arguments.
  • Créez une fonction helper (qui prend 1 objet comme paramètre) dans main et créez un objet vide.
  • Parcourez les propriétés d'obj en utilisant for..in .
  • vérifier si key n'est pas présent dans le tableau de clés à supprimer alors
    • Vérifiez si la valeur est object puis appelez la fonction de manière récursive
    • Si ce n'est pas un objet, ajoutez-le à l'objet de résultat.
  • Enfin renvoyer l'objet de résultat.

Le code convertira l'objet de profondeur inconnue en un objet simple et vous pouvez également supprimer les clés des objets imbriqués.

const myObj = { 
  name: 'Luke',
  age: 12,
  height: '163cm',
  weight: '60kg',
  others: { one: '1', two: '2'}
};
const removed = ['height','weight','one'];

function removeKeys(obj,removed){
  const res = {};
  function helper(obj){
    for(let key in obj){
      if(!removed.includes(key)){
        if(typeof obj[key] === "object"){
          helper(obj[key]);
        }
        else res[key] = obj[key]
      }
    }
    
  }
  helper(obj)
  return res;
}

const res = removeKeys(myObj,removed);
console.log(res)


5 commentaires

Merci pour la réponse. Que faire si je n'ai besoin que de la clé «un» de l'objet imbriqué de profondeur connue. Est-ce possible? J'ai mis à jour la question


@Outlooker La fonction que j'ai créée prend un tableau comme argument. Ce tableau contiendra toutes les clés à supprimer de n'importe quel niveau d'objet imbriqué. Voulez-vous la fonction qui récupère toutes les clés du tableau?


La fonction que vous avez fournie fonctionne de première classe. Mais je voulais juste savoir si cela est possible en utilisant la déstructuration si l'objet est de profondeur connue


@Outlooker Je pense qu'il n'y a aucun moyen. Parce qu'il n'y a aucun moyen de déstructurer toutes les propriétés de l'objet imbriqué.


Merci pour l'aide @Maheer. Apprécié. :)



4
votes

Par souci d'exhaustivité, une approche iife est possible. Cela fonctionne en créant une fonction fléchée qui prend comme paramètres les clés que vous souhaitez conserver. Dans le corps de la fonction, répartissez les objets imbriqués comme vous le souhaitez.

const myObj = { 
  name: 'Luke',
  age: 12,
  height: '163cm',
  weight: '60kg',
  others: { one: '1', two: '2'}
};

const newObj = (
  ({name, age, others}) => ({name, age, ...others})
)(myObj);

console.log(newObj);


2 commentaires

Merci pour la réponse. Que faire si je n'ai besoin que de la clé «un» de l'objet imbriqué. Est-ce possible? J'ai mis à jour la question.


Vous pouvez utiliser Object.assign ({}, {name, age}, {one: others.one}) comme corps de la fonction. Cependant, il semble que vous recherchiez une fonction générale qui prendra quelque chose comme un tableau de touches à conserver et copiera tout récursivement (éventuellement avec aplatissement)? Pouvez-vous préciser vos besoins un peu plus? Sinon, c'est un coup de taupe.