Эффективный способ объединить массив объектов с похожими данными - PullRequest
0 голосов
/ 14 сентября 2018

У меня есть два массива с очень большим, но неизвестным количеством объектов.Например:

const x = [
  {
    id:'apples',
    oldData: {
      min: 9,
      max: 50
    }
  },
  ...
]

const y = [
  {
    id:'bananas',
    newData: {
      min: 2,
      max: 60
    }
  },

  {
    id:'apples',
    newData: {
      min: 50,
      max: 200
    }
  },
  ...
]

Мне нужно объединить их, чтобы мой результат был примерно таким:

const x = [
  {
    id:'apples',
    oldData: {
      min: 9,
      max: 50
    },
    newData: {
      min: 50,
      max: 200
    }
  },
  {
    id:'bananas',
    newData: {
      min: 2,
      max: 60
    }
  }
  ...
]

Обратите внимание, что яблоки объединяются для включения данных из массивов, а бананы добавляются какновый элемент, так как у него не было совпадения.Каждый массив может иметь сотни значений каждый, поэтому я обнаружил, что делать .map() и Object.keys().map() было действительно дорого.

Использование ES6 и Lodash импортируется.

Ответы [ 2 ]

0 голосов
/ 14 сентября 2018

Создание карты - это путь (одна итерация на массив):

const x = [ { id:'apples', oldData: { min: 9, max: 50 } } ];
const y = [
    { id:'bananas', newData: { min: 2,  max: 60  } },
    { id:'apples',  newData: { min: 50, max: 200 } }
];

let lookup = {};

//old
x.forEach(x_i => {
    lookup[x_i.id] = x_i;
});

//new
y.forEach(y_i => {
    if (y_i.id in lookup === false)
        lookup[y_i.id] = {};
    lookup[y_i.id].newData = y_i.newData;
});

console.log(lookup);

output:

{ apples:
   { id: 'apples',
     oldData: { min: 9, max: 50 },
     newData: { min: 50, max: 200 } },
  bananas: { newData: { min: 2, max: 60 } } }
0 голосов
/ 14 сентября 2018

Вы можете попробовать следующее

const x = [{id:'apples',oldData: {min: 9,max: 50}}];
const y = [{id:'bananas',newData: {min: 2,max: 60}},{id:'apples',newData: {min: 50,max: 200}}];

// Create an object with id as key and object as value
let obj = x.reduce((a,c) => Object.assign(a, {[c.id]:c}), {});
// Updating the value of object and adding new entries
y.forEach(v => {
  if(obj[v.id]) obj[v.id].newData = v.newData;
  else obj[v.id] = v;
});
// Getting the values in the object
console.log(Object.values(obj));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...