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
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);
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
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.
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.
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é.
Vous pouvez aussi essayer ceci:
arrOfObj.forEach(function(item){item.isActive = true;});
console.log(arrOfObj);
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;
});
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;
});