Объединение двух массивов объектов путем добавления значений объектов по одному и тому же идентификатору, а также добавления уникального идентификатора - PullRequest
1 голос
/ 01 мая 2020

У меня есть рабочая функция, которая объединяет два массива объектов разной длины (источник> цель при трех условиях:

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

Мой вопрос: как я могу изменить этот код, чтобы он стал более компактным и эффективным? просто глядя на код, кажется, что это потребовало бы большого количества вычислительных ресурсов ..

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

let target = [
  { id:1, x: 50 },
  { id:2, x: 30 },
  { id:3, x: 30 }
];

let source = [
  { id:1, x: 30 },
  { id:2, x: 13 },
  { id:4, x: 100 },
  { id:5, x: 5 }
];

let arrayResult = [];
function compute( target, source ) {
    for (let i = 0; i < source.length; i++ ) {
        let srcObj = source[i];
        let tarObj = target.find(d => d.id === srcObj.id)

        if (tarObj) {
            let result = {
                id: srcObj.id,
                x: srcObj.x - tarObj.x
            }
            arrayResult.push(result);
        } else {
            arrayResult.push(srcObj);
        }
    }
    for( let i = 0; i < target.length; i ++ ) {
        let src = target[i];
        let tar = arrayResult.find(d => d.id === src.id);
        if (!tar){
            arrayResult.push(src)
        }
    }
}
compute(target, source);
console.log(arrayResult);

1 Ответ

0 голосов
/ 01 мая 2020

Вы можете сделать это более эффективным, сгенерировав массив, сопоставляющий id значения в source их индексу в массиве. Затем вы можете выполнить итерацию по target, проверяя, есть ли у каждого объекта id значение запись в массиве srcids, и, если это так, обновлять соответствующее значение source x, в противном случае объект помещается в * 1008. * массив:

let target = [
  { id:1, x: 50 },
  { id:2, x: 30 },
  { id:3, x: 30 }
];

let source = [
  { id:1, x: 30 },
  { id:2, x: 13 },
  { id:4, x: 100 },
  { id:5, x: 5 }
];

const srcids = source.reduce((c, o, i) => {
  c[o.id] = i;
  return c;
}, []);

target.forEach(o => {
  if (srcids[o.id] !== undefined) {
    source[srcids[o.id]].x -= o.x;
  } else {
    source.push(o);
  }
});

console.log(source);
...