2
votes

Ajouter une paire valeur / clé (objet) à tous les objets du tableau

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


3 commentaires

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


4 Réponses :



3
votes

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


0 commentaires

0
votes

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


0 commentaires

2
votes

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


2 commentaires

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