Flatten array avec des objets dans 1 objet

Entrée donné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 éventail 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 que vous pourriez avoir besoin de le faire polyvalent (avec core-js, un autre polyfill ou en utilisant le polyfill sur MDN).

Vous avez mentionné lodash, il vaut la peine de souligner qu'il est livré avec une fonction _.assign à cet effet qui fait la même chose:

  var merged = _.assign.apply(_, [{ a: 1 }, { b: 2 }, { c: 3 }]); 

Mais je recommande vraiment la nouvelle façon de bibliothèque standard.

Voici une version qui n'utilise 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/

Avec lodash, vous pouvez utiliser la fusion () :

 var arr = [ { a: 1 }, { b: 2 }, { c: 3 } ]; _.merge.apply(null, [{}].concat(arr)); // → { a: 1, b: 2, c: 3 } 

Si vous faites cela dans plusieurs endroits, vous pouvez faire merge() un peu plus élégant en utilisant partial () et spread () :

 var merge = _.spread(_.partial(_.merge, {})); merge(arr); // → { a: 1, b: 2, c: 3 } 

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 } ] 

Je peux le tester

J'ai une petite solution qui ne nécessite 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 🙂