#arrays #reactjs #react-hooks
#массивы #reactjs #реагирующие хуки
Вопрос:
Я хочу добавить объект addItem
в cartItems
список, но если id
он совпадает с элементом, который уже есть в списке cartItems
, я не хочу добавлять другой объект, вместо этого он добавит предыдущий amountPrice
и orderAmount
вместе с ним новый.
Есть ли у меня способ добиться этого?
const [cartItems, setCartItems] = useState(cartLocalStorage());
const addToCart = (id, name, image, amountPrice, orderAmount) => {
const addItem = {
id: id,
name: name,
image: image,
amountPrice: amountPrice,
orderAmount: orderAmount,
};
setCartItems([...cartItems, addItem]);
};
};
Комментарии:
1. Эта часть немного неясна, вместо этого она добавит предыдущую amountPrice и orderAmount с новым . Можете ли вы уточнить?
2. поэтому, прежде чем новые данные будут сохранены в массиве, сначала он проверит, есть ли уже идентификатор, что означает, что он не создаст другой объект, а изменит только 2 других ключевых свойства, amountPrice и orderAmount. И он не перезапишет его, но добавит новое значение, которое является суммой старого значения нового значения
Ответ №1:
Попробуйте это сделать:
const addToCart = (id, name, image, amountPrice, orderAmount) => {
if(cartItems.find(i => i.id === id)){
setCartItems(cartItems.map(item => {
if(item.id === id){
item.amountPrice = amountPrice;
item.orderAmount = orderAmount;
}
return item;
}));
}else{
setCartItems([...cartItems, {id, name, image, amountPrice, orderAmount}]);
}
}
addToCart
проверит, находится ли элемент уже в cartItems
by id
, и если да, добавит значения amountPrice
и orderAmount
к соответствующим значениям существующего элемента.
Если, однако, идентификатор отсутствует cartItems
, он добавит новый элемент в массив.
Комментарии:
1. спасибо, это работает, но у меня есть вопрос. Почему вы использовали
find()
notfilter()
в этом случае?2. @BaBi Я думаю, что использование
find
в этом контексте немного более интуитивно понятно. Я, конечно, мог бы использоватьfilter
, и результат был бы тем же, ноfilter
обычно используется в ситуациях, когда вам нужно возвращать несколько элементов массива. Поскольку я знаю, что есть только один, который может соответствоватьid
,find
он оказался более подходящим для удобства чтения.3. о, теперь я понимаю эти понятия, спасибо, я многому научился у вас.
Ответ №2:
Я не тестировал его и, вероятно, не будет работать, но, надеюсь, направит вас в правильном направлении:
const [cartItems, setCartItems] = useState(cartLocalStorage());
const addToCart = (id, name, image, amountPrice, orderAmount) => {
const addItem = {
id: id,
name: name,
image: image,
amountPrice: amountPrice,
orderAmount: orderAmount,
};
const index = cartItems.findIndex(item => item.id === id);
if (index !== -1) {
cartItems[index] = {...cartItems[index], ...addItem};
setCartItems(cartItems);
} else {
setCartItems([...cartItems, addItem]);
}
};
Приветствия