Сравнить два массива объектов Js

Требуется помощь в реализации задачи! Имеем два массива:

const arr = [
  {
   stackId: "1",
   name: "Ivan",
   otherInfo: "bla-bla-bla",
  }
  {
   stackId: "2",
   name: "Igor",
   otherInfo: "bla-bla-bla",
  }
  {
   stackId: "3",
   name: "Andrey",
   otherInfo: "bla-bla-bla",
  }
]

const arr2 = [
  {
   _id: "1",
   key: "active",
   otherInfo: "bla-bla-bla",
  }
  {
   _id: "2",
   key: "not active",
   otherInfo: "bla-bla-bla",
  }
  {
   _id: "3",
   key: "not active",
   otherInfo: "bla-bla-bla",
  }

Нужно пробежаться по всему массиву и для каждого объекта сравнить stackId из arr и _id из arr2 и если они совпадают, то в arr для проверяемого объекта нужно добавить свойство status с соответствующим значением из свойства key из массива arr2... Исходя из примера должен получиться такой массив

const result = [
  {
   stackId: "1",
   name: "Ivan",
   status: "active",
   otherInfo: "bla-bla-bla",
  }
  {
   stackId: "2",
   name: "Igor",
   status: "not active",
   otherInfo: "bla-bla-bla",
  }
  {
   stackId: "3",
   name: "Andrey",
   status: "not active",
   otherInfo: "bla-bla-bla",
  }
]

P.S. массивы могут быть не отсортированы, так что нужно ориентироваться только на stackId и _id


Ответы (2 шт):

Автор решения: Jour

Попробуйте так

const arr = [
  {
    stackId: "1",
    name: "Ivan",
    otherInfo: "bla-bla-bla",
  },
  {
    stackId: "2",
    name: "Igor",
    otherInfo: "bla-bla-bla",
  },
  {
    stackId: "3",
    name: "Andrey",
    otherInfo: "bla-bla-bla",
  }
]

const arr2 = [
  {
    _id: "1",
    key: "active",
    otherInfo: "bla-bla-bla",
  },
  {
    _id: "2",
    key: "not active",
    otherInfo: "bla-bla-bla",
  },
  {
    _id: "3",
    key: "not active",
    otherInfo: "bla-bla-bla",
  }
]
//
const indexs = new Map()
arr2.forEach(el => indexs.set(el._id, el.key))
arr.map(el => {
  const key = indexs.get(el.stackId)
  if ( !key ) return el
  el.status = key
  return el
})
console.log(arr)

→ Ссылка
Автор решения: Pr0gramm1st

const arr = [{
  stackId: "1",
  name: "Ivan",
  otherInfo: "bla-bla-bla",
}, {
  stackId: "2",
  name: "Igor",
  otherInfo: "bla-bla-bla",
}, {
  stackId: "3",
  name: "Andrey",
  otherInfo: "bla-bla-bla",
}];

const arr2 = [{
  _id: "1",
  key: "active",
  otherInfo: "bla-bla-bla",
}, {
  _id: "2",
  key: "not active",
  otherInfo: "bla-bla-bla",
}, {
  _id: "3",
  key: "not active",
  otherInfo: "bla-bla-bla",
}];
const result = [];
for (let i = 0; i <= arr.length - 1; i++) {
  for (let y = 0; y <= arr2.length - 1; y++) {
    if (arr[i].stackId == arr2[y]._id) {
      arr[i].status = arr2[y].key;
      result[i] = {
        stackId: arr[i].stackId,
        name: arr[i].name,
        status: arr[i].status,
        otherInfo: arr2[y].otherInfo,
      }
    }
  }
}
console.log(result);

P.S. Но у Владимира красивее ответ)) Хотя и не учтён порядок элементов в элементе-объекте в результирующем массиве

→ Ссылка