web-dev-qa-db-fra.com

Ajouter une paire de clés à tous les objets du tableau

Je voulais ajouter un paramètre clé: valeur à tous les objets d'un tableau.

par exemple: 

var arrOfObj = [{name: 'eve'},{name:'john'},{name:'jane'}];

Maintenant, je voulais ajouter un nouveau paramètre, isActive à tous les objets afin que le tableau résultant ressemble.

par exemple: 

    [{
    name: 'eve',
    isActive: true
}, {
    name: 'john',
    isActive: true
}, {
    name: 'jane',
    isActive: true
}]

Je peux toujours parcourir le tableau et insérer une paire clé-valeur. Mais je me demandais s'il y avait une meilleure façon de le faire

23
Shrujan Shetty

Vous pouvez le faire avec map()

var arrOfObj = [{
  name: 'eve'
}, {
  name: 'john'
}, {
  name: 'jane'
}];

var result = arrOfObj.map(function(o) {
  o.isActive = true;
  return o;
})

console.log(result)

Si vous voulez conserver le tableau d'origine, vous pouvez cloner des objets avec Object.assign()

var arrOfObj = [{
  name: 'eve'
}, {
  name: 'john'
}, {
  name: 'jane'
}];

var result = arrOfObj.map(function(el) {
  var o = Object.assign({}, el);
  o.isActive = true;
  return o;
})

console.log(arrOfObj);
console.log(result);

32
Nenad Vracar

Sûr. Jetez un coup d'œil à les méthodes de la matrice ES5

Dans ce cas, vous avez suggéré d'utiliser .map () :

arrOfObj.map(function (v) {
 v.isActive = true
})

ou en ES6 

arrOfObj.map(v => v.isActive = true)

Ces méthodes sont bien supportées par les navigateurs (sauf devinez qui ).


Je vous recommande également de bien comprendre les méthodes suivantes: .map () , .filter () et .reduce () . C'est un bon point pour commencer

11
Sergei Panfilov

Je serais un peu prudent avec certaines des réponses présentées ici, les exemples suivants produisent différemment selon l'approche: 

const list = [ { a : 'a', b : 'b' } , { a : 'a2' , b : 'b2' }]

console.log(list.map(item => item.c = 'c'))
// [ 'c', 'c' ]

console.log(list.map(item => {item.c = 'c'; return item;}))
// [ { a: 'a', b: 'b', c: 'c' }, { a: 'a2', b: 'b2', c: 'c' } ]

console.log(list.map(item => Object.assign({}, item, { c : 'c'})))
// [ { a: 'a', b: 'b', c: 'c' }, { a: 'a2', b: 'b2', c: 'c' } ]

J'ai utilisé node v8.10.0 pour tester les morceaux de code ci-dessus.

9
MarcoSantana

La solution de @ Redu est une bonne solution 

arrOfObj.map (o => o.isActive = true;) mais Array.map compte toujours comme une boucle dans tous les éléments.

si vous ne voulez absolument pas avoir de boucle, voici un sale tour de main: 

Object.defineProperty(Object.prototype, "isActive",{
  value: true,
  writable: true,
  configurable: true,
  enumerable: true
});

mon conseil est de ne pas l'utiliser avec précaution cependant, .__, il va absolument patcher tous les objets javascript (Date, Array, Number, String ou tout autre objet héritant d'Object), ce qui est vraiment une mauvaise pratique.

2
user2173403

Vous pouvez simplement ajouter de cette façon. voir ci-dessous l'image de la console

 enter image description here

1
Umar Tariq

Utilisez simplement map function:

var arrOfObj = arrOfObj.map(function(element){
   element.active = true;
   return element;
}

La compatibilité de la carte est bonne: vous pouvez être relativement sûrs de IE <= 9.

Cependant, si vous êtes sûr à 100% que vos utilisateurs utiliseront un navigateur compatible ES6, vous pouvez raccourcir cette fonction avec les fonctions flèche , comme @Sergey Panfilov l'a suggéré.

0
Luxor001

Vous pouvez aussi essayer ceci:

arrOfObj.forEach(function(item){item.isActive = true;});

console.log(arrOfObj);
0
Dhananjaya Kuppu
    var arrOfObj = [{name: 'eve'},{name:'john'},{name:'jane'}];
    var injectObj = {isActive:true, timestamp:new Date()};

    // function to inject key values in all object of json array

    function injectKeyValueInArray (array, keyValues){
        return new Promise((resolve, reject) => {
            if (!array.length)
                return resolve(array);

            array.forEach((object) => {
                for (let key in keyValues) {
                    object[key] = keyValues[key]
                }
            });
            resolve(array);
        })
    };

//call function to inject json key value in all array object
    injectKeyValueInArray(arrOfObj,injectObj).then((newArrOfObj)=>{
        console.log(newArrOfObj);
    });

Sortie comme ceci: -

[ { name: 'eve',
    isActive: true,
    timestamp: 2017-12-16T16:03:53.083Z },
  { name: 'john',
    isActive: true,
    timestamp: 2017-12-16T16:03:53.083Z },
  { name: 'jane',
    isActive: true,
    timestamp: 2017-12-16T16:03:53.083Z } ]
arrOfObj.map(o => { 
  o.isActive = true; 
  return o; 
});
0
Andrew Koper

En passant en boucle dans le tableau et en insérant une clé, la paire de valeurs est votre meilleure solution. Vous pouvez utiliser la fonction "carte" mais c'est juste une question de préférence. 

var arrOfObj = [{name: 'eve'},{name:'john'},{name:'jane'}];
arrOfObj.map(function (obj) { 
   obj.isActive = true;
});
0
splay