Вы можете проверить, присутствует ли уже в массиве объект с таким же идентификатором и в каком количестве.В этом случае обновите количество, в противном случае добавьте объект в массив.
Я бы написал несколько вспомогательных методов, чтобы все было ясно и отдельно.
Вы можете проверить наличие по количеству с помощью чего-то вродеthis:
const quantityForItem = (list, newItem) => {
const item = list.find(item => item.id === newItem.id)
return item && item.quantity || 0
}
Вы можете увеличивать или уменьшать количество предметов, переназначая список и изменяя интересующий предмет:
const updateQuantity = (list, newItem, variation) =>
list.map(item => {
if ( item.id !== newItem.id ) return item
return { ...item, quantity: item.quantity + variation }
})
Вы можете добавить новый предмет, просто констатируя его впредыдущий списокОбратите внимание: concat
, а не push
, потому что нам нужно сохранить его неизменным.
const add = (list, newItem) =>
list.concat(newItem)
Удаление объекта может быть таким же, как у вас:
const remove = (list, itemToRemove) =>
list.filter(item => item.id !== itemToRemove.id)
Собираем все вместе:
case 'CART_ADDITEM': {
const { cart } = state
const newItem = action.payload
if ( quantityForItem(cart, newItem) !== 0 ) {
return { cart: updateQuantity(cart, newItem, +1) }
}
return { cart: add(cart, newItem) }
}
case 'CART_REMOVEITEM': {
const { cart } = state
const itemToRemove = action.payload
if ( quantityForItem(cart, itemToRemove) > 1 ) {
return { cart: updateQuantity(cart, itemToRemove, -1) }
}
return { cart: remove(cart, itemToRemove) }
}