Объединить объекты в массиве с одинаковым ключом - PullRequest
0 голосов
/ 07 декабря 2018

У меня есть массив объектов:

objArray = [
    {x: 1, y: 7},
    {x: 2, y: 14},
    {x: 1, z: 9},
    {x: 2, z: 18}
    {x: 1, n: 6}
    {x: 2, n: 16}
]

Есть ли эффективный способ слияния для "X" без цикла for?так что я получаю:

objArray = [
    {x: 1, y: 7, z: 9, n: 6},
    {x: 2, y: 14, z: 18, n: 16}
]

Итак, ищите общие objArray[n]["x"] и объединяете все попадания в один объект?Можно изменить исходный массив или создать новый.

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

Ответы [ 3 ]

0 голосов
/ 07 декабря 2018

Вы можете сделать это с помощью Массив # уменьшить :

const objArray = [
    {x: 1, y: 7},
    {x: 2, y: 14},
    {x: 1, z: 9},
    {x: 2, z: 18},
    {x: 1, n: 6},
    {x: 2, n: 16},
]

const result = Object.values( objArray.reduce( 
  (p,c) => (p[c.x] = Object.assign( {}, p[c.x], c ), p ), {}
) );

console.log( result );
0 голосов
/ 07 декабря 2018

Вы можете взять Map и сгруппировать по свойству x.

var array = [{ x: 1, y: 7 }, { x: 2, y: 14 }, { x: 1, z: 9 }, { x: 2, z: 18 }, { x: 1, n: 6 }, { x: 2, n: 16 }],
    result = Array.from(
        array
            .reduce((m, o) => m.set(o.x, Object.assign({}, m.get(o.x), o)), new Map)
            .values()
    );
    
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
0 голосов
/ 07 декабря 2018

Вы можете использовать метод reduce для создания объекта, а затем Object.values для получения массива.

const data = [{"x":1,"y":7},{"x":2,"y":14},{"x":1,"z":9},{"x":2,"z":18},{"x":1,"n":6},{"x":2,"n":16}]
const res = data.reduce((r, {x, ...rest}) => {
  if(!r[x]) r[x] = {x, ...rest}
  else Object.assign(r[x], rest);
  return r;
}, {})

const result = Object.values(res);

console.log(result)
...