Подтвердить что ты не робот

Сгладить массив с объектами в 1 объект

Данный ввод:

[{ a: 1 }, { b: 2 }, { c: 3 }]

Как вернуть:

{ a: 1, b: 2, c: 3 }

Для массивов это не проблема с lodash, но здесь у нас есть массив объектов.

4b9b3361

Ответ 1

Используйте Object.assign:

let merged = Object.assign(...arr); // ES6 (2015) syntax

var merged = Object.assign.apply(Object, arr); // ES5 syntax

Обратите внимание, что Object.assign еще не реализовано во многих средах, и вам может понадобиться polyfill его (либо с помощью ядра-js, другого polyfill, либо с помощью polyfill на MDN).

Вы упомянули lodash, поэтому стоит отметить, что для этой цели используется функция _.assign, которая делает то же самое:

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

Но я действительно рекомендую новый стандартный способ библиотеки.

Ответ 2

С lodash вы можете использовать merge():

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

Если вы делаете это в нескольких местах, вы можете сделать merge() немного более элегантным, используя partal() и spread():

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

Ответ 3

Вот версия, не использующая методы 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);

скрипт: http://jsfiddle.net/yaw3wbb8/

Ответ 4

Вы можете использовать функцию underscore.extend следующим образом:

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

И чтобы предотвратить изменение исходного массива, вы должны использовать

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

Здесь можно протестировать его

Ответ 5

У меня есть аккуратное небольшое решение, не требующее polyfill.

var arr = [{ a: 1 }, { b: 2 }, { c: 3 }];
var object = {};

arr.map(function(obj){
    var prop = Object.getOwnPropertyNames(obj);
    object[prop] = obj[prop];
});

Надеюсь, что помогает:)

Ответ 6

Вот хорошее использование Object.assign с функцией array.prototype.reduce:

let merged = arrOfObjs.reduce((accum, val) => {
  Object.assign(accum, val);
  return accum;
}, {})

Этот подход не изменяет входной массив объектов, что может помочь вам избежать трудностей в устранении неполадок.

Ответ 7

Вы можете легко выровнять свой объект в массив.

function flatten(elements) {
  return elements.reduce((result, current) => {
    return result.concat(Array.isArray(current) ? flatten(current) : current);
  }, []);
};