Object.assign - объединение значений массивов - PullRequest
1 голос
/ 04 июня 2019

У меня есть функция, которая возвращает объект как (ключ это строка, а значение это массив строк):

{"myType1": ["123"]}

Я хочу объединить все результаты, которые он возвращает, например, если у меня есть:

{"myType1": ["123"]}

{"myType2": ["456"]}

{"myType1": ["789"]}

Я бы хотел получить

{"myType1": ["123", "789], "myType2": ["456"]}

Я видел Object.assign, однако это не объединяет значения, которые он просто заменяет самыми последними.

У кого-нибудь есть примеры того, как мне этого добиться?

Любая помощь приветствуется.

Спасибо.

Ответы [ 3 ]

3 голосов
/ 04 июня 2019

Вы можете использовать ключи объекта с помощью Object.keys.Используйте forEach для циклического переключения клавиш и изменения объекта result.

var result = {};
function mergeObj(o) {
  Object.keys(o).forEach(k=>{
    result[k] = ( result[k] || [] ).concat(o[k]);
  })
}

mergeObj({"myType1": ["123"]});
mergeObj({"myType2": ["456"]});
mergeObj({"myType1": ["789"]});

console.log(result);
0 голосов
/ 04 июня 2019

Вот один вкладыш с нужным процессом:

Array.from(new Set([{"myType1": ["123"]}, {"myType2": ["456"]}, {"myType1": ["789"]}].map(item => Object.keys(item)[0]).sort())).map(e => { const entry = {}; entry[e] = items.filter(item => Object.keys(item)[0] === e).map(item => item[e][0]); return entry })

Результат:

[ { myType1: [ '123', '789' ] }, { myType2: [ '456' ] } ]

Привет.

0 голосов
/ 04 июня 2019

Создайте функцию, которая добавляет каждое свойство к результирующему объекту, и вызывайте ее для каждого получаемого вами объекта.

let res = {};

const addObj = obj => {
  Object.entries(obj).forEach(([k, v]) => (res[k] = res[k] || []).push(...v));
};

addObj({"myType1": ["123"]});
addObj({"myType2": ["456"]});
addObj({"myType1": ["789"]});

console.log(res);
.as-console-wrapper { max-height: 100% !important; top: auto; }
...