web-dev-qa-db-fra.com

Aplatir un tableau d'objets en un objet

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.

23
Szymon Toda

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.

45
Benjamin Gruenbaum

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 }
5
Adam Boduch

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/

4
Michael Coxon

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

Ici peut le tester

4
Vladimir

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

1
jonny

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.

0
deed02392