Как объединить два массива объектов, отфильтровывая совпадающие идентификаторы и объединяя объекты с совпадающими идентификаторами по отдельности

Мне нужно объединить два массива объектов:

const local: [
    {id: 1, balance: 2200, ref: 'A'},
    {id: 2, balance: 2100, ref: 'C'}
]
const remote: [
    {id: 1, balance: 3300, ref: 'B'},
]

Мне нужно объединить эти массивы, так что любые два объекта с одинаковым идентификатором объединяются — сохраняя один и тот же идентификатор, сохраняя баланс от remote и объединяя их значения ref, поэтому идеальным результатом этого примера будет:

  [
       { id: 1, balance: 3300, text: 'A / B' },
       { id: 2, balance: 2100, text: 'C' }
  ]

Как бы я это сделал? Я пробовал следующее:

function mergeFunc(remoteArray, localArray) {
    const newArray = [];
    //loop over one of the arrays
    for (const localObj of localArray) {
        //for each iteration, search for object with matching id in other array
        if (remoteArray.some(remoteObj => remoteObj.id === localObj.id)){
            //if found matching id, fetch this other object
            const id:matchingRemoteObj = remoteArray.find(item => item.id === localObj.id);
            //create new, merged, object
            const newObj = {id:matchingRemoteObj.id, balance: id:matchingRemoteObj.balance, text:`${localObj.text} / ${id:matchingRemoteObj.text}`}
            //push new value to array
            newArray.push(newObj);
        }
    }
    return newArray;
}

Проблема в том, что это решение дает мне массив объединенных объектов с совпадающими идентификаторами. Мне нужен массив со всеми объектами, объединяющий только те, у которых совпадают идентификаторы...

Могут ли в remote быть объекты с идентификаторами, которых нет в local? Если да, следует ли включать эти объекты в вывод?

Nick Parsons 24.11.2022 12:52

@NickParsons да, удаленный и локальный - это независимые массивы, которые необходимо время от времени «синхронизировать» - и объединять. В объединенном выводе должны быть все уникальные объекты из обоих массивов и объединенные объекты, идентификаторы которых совпадают...

Billies Wesley 24.11.2022 13:02
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
2
73
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Причина в коде ниже, вы просто отправляете записи совпадений, которые вызывают эту проблему.

if (remoteArray.some(remoteObj => remoteObj.id === localObj.id))

Ниже приведена ссылка для вас с использованием Array.map() и Array.find()

const local = [
    {id: 1, balance: 2200, ref: 'A'},
    {id: 2, balance: 2100, ref: 'C'}
]
const remote = [
    {id: 1, balance: 3300, ref: 'B'},
]

let result = local.map(e =>{
  let r = remote.find(i => i.id === e.id)
  let ref = r?.ref
  if (ref){
    e.balance = r.balance
    e.ref += ' / ' + ref
   }
  return e
})
console.info(result)

Обновление: если вы хотите, чтобы ваш исходный код работал, вам нужно добавить блок else, если совпадения нет.

const local = [
    {id: 1, balance: 2200, ref: 'A'},
    {id: 2, balance: 2100, ref: 'C'}
]
const remote = [
    {id: 1, balance: 3300, ref: 'B'},
]


function mergeFunc(remoteArray, localArray) {
    const newArray = [];
    //loop over one of the arrays
    for (const localObj of localArray) {
        //for each time, search for object with matching id in other array
        if (remoteArray.some(remoteObj => remoteObj.id === localObj.id)){
            //if found matching id, fetch this other object
            const matchingRemoteObj = remoteArray.find(item => item.id === localObj.id);
            //create new, merged, object
            const newObj = {id:matchingRemoteObj.id, balance: matchingRemoteObj.balance, text:`${localObj.ref} / ${matchingRemoteObj.ref}`}
            //push new value to array
            newArray.push(newObj);
        }else{
          // this will add not match record into result array
          newArray.push(localObj) 
        }
    }
    return newArray;
}

let result = mergeFunc(remote,local)
console.info(result)

Вы можете использовать методы array.map и array.find,

Чтобы заменить баланс матча удаленным массивом, который вы можете использовать,

obj.balance = o.balance

Чтобы объединить строку ссылки соответствующего идентификатора, вы можете использовать

obj.ref = `${obj.ref} / ${o.ref}`

Рабочий фрагмент:

const local = [
    { id: 1, balance: 2200, ref: "A" },
    { id: 2, balance: 2100, ref: "C" },
  ];
  const remote = [{ id: 1, balance: 3300, ref: "B" }];

  const result = local.map((obj) => {
    remote.find((o) => {
      if (o.id === obj.id) {
        obj.balance = o.balance;
        obj.ref = `${obj.ref} / ${o.ref}`;
      }
    });
    return obj;
  });

  console.info(result);

Другие вопросы по теме