Ma question porte sur Ajouter une paire valeur / clé à tout objets dans un tableau
Cependant, les solutions ne fonctionnent pas lorsque j'essaie d'attribuer un objet au lieu d'une chaîne, int, etc.
J'ai essayé de créer la nouvelle clé à l'intérieur de la fonction de carte , mais cela ne fonctionne qu'avec des variables non-objet.
Cela fonctionne
.as-console-wrapper { max-height: 100% !important; top: 0; }
Cela ne fonctionne pas
var arrOfObj = [{ name: 'eve' }, { name: 'john' }, { name: 'jane' }]; var obj = { a: 'a', b: 'b', c: 'c' } arrOfObj.map(item => item.newKey = obj); console.log(arrOfObj);
4 Réponses :
Vous devez créer une copie de l'objet. Par défaut, l'objet est affecté comme référence.
ici Vous pouvez voir quelques cas d'utilisation ici ...
est utilisé pour créer une copie superficielle .as-console-wrapper { max-height: 100% !important; top: 0; }
var arrOfObj = [{name: 'eve'}, {name: 'john'}, { name: 'jane'}];
var obj = { a: 'a', b: 'b', c: 'c'}
arrOfObj.forEach(item => (item.newKey = {...obj}));
console.log(arrOfObj);
Vous devez utiliser .. .
(opérateur de propagation)
.as-console-wrapper { max-height: 100% !important; top: 0; }
var arrOfObj = [{ name: 'eve' }, { name: 'john' }, { name: 'jane' }]; var obj = { a: 'a', b: 'b', c: 'c' }; arrOfObj.forEach(item => item.newKey = JSON.parse(JSON.stringify(obj))); console.log(arrOfObj);
Vous pouvez également utiliser JSON
:
.as-console-wrapper { max-height: 100% !important; top: 0; }
var arrOfObj = [{ name: 'eve' }, { name: 'john' }, { name: 'jane' }]; var obj = { a: 'a', b: 'b', c: 'c' }; arrOfObj.forEach(item => item.newKey = {...obj}); console.log(arrOfObj);
Vous devez cloner l'élément, vous ajoutez le même objet à plusieurs propriétés.
Voyez ci-dessous comment cela devrait être.
var arrOfObj = [{ name: 'eve' }, { name: 'john' }, { name: 'jane' }]; var obj = { a: "a", b: "b", c: "c" } arrOfObj.map(item => // clone the item item.newKey = JSON.parse(JSON.stringify(obj)) ); console.log(arrOfObj);
Une alternative consiste à utiliser Object. attribuer () . Rappelez-vous que les objets sont copiés par la valeur de la référence, c'était votre problème, au lieu d'un nouvel objet pour chaque newKey
, vous aviez plusieurs références au même objet.
var arrOfObj = [ {name: 'eve'}, {name: 'john'}, {name: 'jane'} ]; var obj = { a: 'a', b: 'b', c: 'c' }; arrOfObj.map(item => item.newKey = Object.assign({}, obj)); console.log(arrOfObj); // After some modification. arrOfObj[0].newKey.a = "XXX" console.log(arrOfObj);
Notez que Object.create ()
ne fait pas exactement ce que vous dites. Object.create ()
crée un nouvel objet et définit le prototype comme l'argument que vous lui passez. Ce n’est pas la même chose que la création d’une copie de l’objet. D'ailleurs, apporter une modification à obj
entraînera toujours un changement perçu dans les objets créés, même s'ils ne partagent pas de référence.
@MadaraUchiha vous aviez raison, merci, j'ai changé pour Object.assign ()
à la place
Qu'est-ce que
arrObjects
? Pouvez-vous poster le reste de votre code s'il vous plaît?Vous pouvez également clarifier ce que vous entendez par ne fonctionne pas. Qu'attendez-vous? Que se passe-t-il à la place?
Vous ne devez pas muter le tableau d'origine lorsque vous utilisez
map
. Utilisez:arrObjects.map (item => ({... item, newKey: {... obj}}));
à la place