Compte tenu de l'entrée:
[{ a: 1 }, { b: 2 }, { c: 3 }]
Comment retourner:
{ a: 1, b: 2, c: 3 }
Pour les tableaux ce n'est pas un problème avec lodash mais ici nous avons un tableau d'objets.
Utilisez Object.assign
:
let merged = Object.assign(...arr); // ES6 (2015) syntax
var merged = Object.assign.apply(Object, arr); // ES5 syntax
Notez que Object.assign
n'est pas encore implémenté dans de nombreux environnements et vous devrez peut-être le polyfiller (avec core-js, un autre polyfill ou en utilisant le polyfill sur MDN).
Vous avez parlé de lodash, il est donc intéressant de préciser qu’il est doté d’une fonction _.assign
qui remplit la même fonction:
var merged = _.assign.apply(_, [{ a: 1 }, { b: 2 }, { c: 3 }]);
Mais je recommande vraiment la nouvelle méthode de bibliothèque standard.
Avec lodash, vous pouvez utiliser merge () :
var arr = [ { a: 1 }, { b: 2 }, { c: 3 } ];
_.merge.apply(null, [{}].concat(arr));
// → { a: 1, b: 2, c: 3 }
Si vous faites cela à plusieurs endroits, vous pouvez rendre merge()
un peu plus élégant en utilisant partial () et spread () :
var merge = _.spread(_.partial(_.merge, {}));
merge(arr);
// → { a: 1, b: 2, c: 3 }
Voici une version n'utilisant pas les méthodes ES6 ...
var arr = [{ a: 1 }, { b: 2 }, { c: 3 }];
var obj = {};
for(var i = 0; i < arr.length; i++) {
var o = arr[i];
for(var key in o) {
if(typeof o[key] != 'function'){
obj[key] = o[key];
}
}
}
console.log(obj);
violon: http://jsfiddle.net/yaw3wbb8/
Vous pouvez utiliser la fonction underscore.extend comme ça:
var _ = require('underscore');
var a = [{ a: 1 }, { b: 2 }, { c: 3 }];
var result = _.extend.apply(null, a);
console.log(result); // { a: 1, b: 2, c: 3 }
console.log(a); // [ { a: 1, b: 2, c: 3 }, { b: 2 }, { c: 3 } ]
Et pour éviter de modifier le tableau d'origine, vous devez utiliser
var _ = require('underscore');
var a = [{ a: 1 }, { b: 2 }, { c: 3 }];
var result = _.extend.apply(null, [{}].concat(a));
console.log(result); // { a: 1, b: 2, c: 3 }
console.log(a); // [ { a: 1 }, { b: 2 }, { c: 3 } ]
J'ai une jolie petite solution ne nécessitant pas de polyfill.
var arr = [{ a: 1 }, { b: 2 }, { c: 3 }];
var object = {};
arr.map(function(obj){
var prop = Object.getOwnPropertyNames(obj);
object[prop] = obj[prop];
});
J'espère que cela pourra aider :)
Voici une bonne utilisation de Object.assign
avec la fonction array.prototype.reduce
:
let merged = arrOfObjs.reduce((accum, val) => {
Object.assign(accum, val);
return accum;
}, {})
Cette approche ne modifie pas le tableau d'objets en entrée, ce qui peut vous aider à éviter les problèmes difficiles à résoudre.