Как сравнить два массива и изменить значение обьекта в нем, если объекты одинаковые?

Нужно сравнить два массива. Рюкзак и лут который выпал. И если выпала эссенция, то нужно в рюкзаке к нужной эсенции изменить значение count и добавить все вещи и лута

const bag = [
  {
    itemName: "Эссенция мага",
    img: "ЭссенцияМага.png",
    type: "essense",
    count: 50
  }, 
  {
    itemName: "Эссенция Человека",
    img: "ЭссенцияЧеловека.png",
    type: "essense",
    count: 50
   }
 ]
 
 const loot = [
  {
    chance: 90
    id: 1614341726691
    img: "ЭссенцияМага.png"
    itemName: "Эссенция мага"
    type: "essense"
    count: 100
  },
  {
    chance: 99
    id: 1614341726692
    img: "МечМоргота.png"
    itemName: "Меч моргота"
    stats: {dmg: 500}
    type: "weapon"
  }
]

const handleTakeLoot = (bag,loot) => {
const newBag = []
  return newBag
}


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

Автор решения: OPTIMUS PRIME

Технически, так:

// Предполагаю, что bag - объект, а это его методы

function bagFind(item) {
  return bag.find(bagItem => bagItem.itemName == item.itemName)
}

function bagAdd(item) {
  if (!item.count) {
    throw new Error("Добавь item.count элементу " + item.itemName);
  }

  let bagItem = bagFind(item);

  if (bagItem) {
    bagItem.count += item.count;
    console.log( bagItem.itemName + ":", bagItem.count );
  } else {
    console.log("Добавить предмет: " + item.itemName);
  }
}

let bag = [
  { "itemName": "Эссенция мага", "count": 50 },
  { "itemName": "Эссенция Человека", "count": 50 }
];

let loot = [
  { "itemName": "Эссенция мага", count: 100 },
  { "itemName": "Меч моргота", count: 1 }
];

loot.forEach(item => bagAdd(item));

Но вы уверены, что сравнивать предметы через их имена - хорошая идея? Захочется делать мультиязычную игрушку, появится новая головная боль с переводами (и куча лишних операций). Может быть удобнее выдать всем предметам свой уникальный id - число, и в таких операциях использовать его. А имя предмета - только для вывода на экран.

А рассмотрен вариант хранения предметов в таком виде?

bag = {
  1234: {
    id: 1234,
    name: "эссенция",
  },
  10054: {
    id: 10054,
    name: "Меч",
  }
}

Тогда можно сразу по id предмета обнаружить, есть он в рюкзаке или нет.

P.s. Самовольно добавил count: 1 мечу... легче изначально при создании объектов всем выдать count, даже если это 1 шт, чем во всех методах предусмотреть вариант, когда count отсутствует и заменять undefined на 1.

→ Ссылка