Как сравнить два массива и изменить значение обьекта в нем, если объекты одинаковые?
Нужно сравнить два массива. Рюкзак и лут который выпал. И если выпала эссенция, то нужно в рюкзаке к нужной эсенции изменить значение 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 шт):
Технически, так:
// Предполагаю, что 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.