Как я могу объединить два массива объектов в JavaScript - PullRequest
3 голосов
/ 09 мая 2019

У меня простой вопрос. У меня есть два массива A и B, я хочу сохранить объекты A, если B имеет одинаковый идентификатор. Например:

const A = [{id: "price", value: "1"}]

const B = [{id: "price", value: "0"}, {id: "number", value: "0"}]

Ожидаемый результат:

[{id: "price", value: "1"}, {id: "number", value: "0"}}]

Как я могу это сделать?

Я пытался отобразить A и foreach B внутри A, но это не сработало.

Ответы [ 3 ]

4 голосов
/ 09 мая 2019
const result = A.concat(B.filter(bo => A.every(ao => ao.id != bo.id)));

Объединить все объекты из A с объектами из B, которых нет в A (что делается путем фильтрации только объектов из B, где в A нет объекта с помощью тот же идентификатор).

Пример:

const A = [{id: "price", value: "1"}];

const B = [{id: "price", value: "0"}, {id: "number", value: "0"}];

const result = A.concat(B.filter(bo => A.every(ao => ao.id != bo.id)));

console.log(result);
0 голосов
/ 09 мая 2019

Другой вариант, который вы можете попробовать (я считаю, что это будет O (n)), - преобразовать массивы в объекты с идентификатором в качестве ключа, затем расширить (реализация jquery.extend или чисто js), а затем преобразовать объединенный объект обратно в массив.

const A = [{id: "price", value: "1"}];

const B = [{id: "price", value: "0"}, {id: "number", value: "0"}];

//convert arrays to objects
var Bx = {};
B.forEach(i => Bx[i.id] = i);

var Ax = {};
A.forEach(i => Ax[i.id] = i);

//copy all matching id properties from A to B
A.forEach(i => Bx[i.id] = Ax[i.id]);

//convert the merged object to array
var C = [];
Object.getOwnPropertyNames(Bx).forEach(i => C.push(Bx[i]));

console.log(C);
0 голосов
/ 09 мая 2019

Вы бы использовали reduce в объединенном массиве - также превратите value в число:

const A = [{id: "price", value: "1"}];
const B = [{id: "price", value: "0"}, {id: "number", value: "0"}];
const res = Object.values([...A, ...B].reduce((acc, { id, value }) => {
  if (acc[id]) acc[id].value += parseInt(value);
  else acc[id] = { id, value: parseInt(value) };
  return acc;
}, {}));
console.log(res);
.as-console-wrapper { max-height: 100% !important; top: auto; }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...