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 Réponses :
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)
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 :)
Pour l'objet de profondeur inconnue, vous pouvez essayer d'utiliser la récursivité.
helper
(qui prend 1 objet comme paramètre) dans main et créez un objet vide. for..in
. key
n'est pas présent dans le tableau de clés à supprimer alors
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)
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é. :)
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);
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.
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?