24.10.2019, 15:53
|
Аспирант
|
|
Регистрация: 14.08.2018
Сообщений: 65
|
|
Каким способом можно удалить из корзины товары с одинаковым id
Есть два товара id=1, id=2. Сначала добавили по id в корзину через map(), но как удалить по одному при нажатии на кнопку, если есть товары с одинаковым id? Буду признателен за любые идеи.
Последний раз редактировалось Marson, 24.10.2019 в 15:57.
|
|
24.10.2019, 15:56
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
Сообщение от Marson
|
как удалить по одному, если есть товары с одинаковым id?
|
А откуда одинаковые, если идентификатор, это уникальное значение?
|
|
24.10.2019, 15:58
|
Аспирант
|
|
Регистрация: 14.08.2018
Сообщений: 65
|
|
добавили три с id=1, а потом нужно удалить один
|
|
24.10.2019, 16:02
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
Сообщение от Marson
|
добавили три с id=1
|
Как такое возможно?! Товары при помещении в базу автоматически могут получать уникальные идентификаторы (средствами SQL). Если все товары в одной таблице, то у всех товаров не будет одинаковых ID. Если товары разбиваются на несколько таблиц, по числу глобальных категорий, тогда у товаров может быть один и тот же ID, если в корзину поместили товары из разных категорий. Но в этом случае нужно оперировать не только ID товара, но и ID категории.
Исключите неоднозначность в идентификаторах и проблема исчезнет.
|
|
24.10.2019, 16:10
|
Аспирант
|
|
Регистрация: 14.08.2018
Сообщений: 65
|
|
Это react:
let initialState = {
products: [
{id: 1, name: 'Apple'},
{id: 2, name: 'Orange'}
]
};
export const productsReducer = (state = initialState) => {
return state;
};
const Cart = (props) => {
debugger
let elementsCart = props.cart.cart.map((c) => {
return <div>
<h3>
<li >{c.name}</li>
</h3>
<button onClick={() => props.removeFromCart(c.id)}>Remove from cart</button>
</div>
});
return (
<div>
<div><h1>Cart: {" " + props.count}</h1></div>
<div>{elementsCart}</div>
<div>
{props.count === 0 && <div><h3>Nothing added to cart</h3><NavLink to='/market'>
<button>Add some at market</button>
</NavLink></div>}
</div>
</div>
)
};
const initialState = {
cart: []
};
export const cartReducer = (state = initialState, action) => {
switch (action.type) {
case 'ADD_TO_CART':
return {
...state,
cart: [...state.cart, action.payload]
};
case 'REMOVE_FROM_CART':
return {
...state,
cart: state.cart.filter(o => o.id !== action.payload)
};
default:
return state;
}
};
export const addToCart = (obj) => ({type: 'ADD_TO_CART', payload: obj});
export const removeFromCart = (id) => ({type: 'REMOVE_FROM_CART', payload: id});
|
|
24.10.2019, 16:16
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
Сообщение от Marson
|
Это react:
|
Да пофигу, хоть Бейсик - одинаковые идентификаторы недопустимы!! Как не может иметь объект двух одинаковых свойств, а массив двух одинаковых ключей/индексов.
У вас в кармане паспорт, у него есть серия и номер. Паспорта с такой серией и номером больше ни у кого нет во всей стране. Даже если вы смените паспорт, эта серия и номер более использоваться не будет. Это суть уникальности, ибо было бы странным выставлять колье под ID 15, а спустя время под этим ID детский горшок.
Также и на страницах - недопустимо иметь на странице элементы с одинаковыми ID, ибо при обращении по такому ID будет возвращен первый найденный элемент.
И не надо искать костылей решения этой проблемы, наведите порядок с идентификацией своих товаров, это единственное и правильное решение.
PS. Если все таки нет у товаров одинаковых ID и вы не верно формулируете вопрос, и речь идет о добавлении двух единиц одного и того же товара, то в корзину не товар уже имеющийся в ней должен помещаться, а увеличиваться число выбранных.
Последний раз редактировалось laimas, 24.10.2019 в 16:21.
|
|
24.10.2019, 18:55
|
Аспирант
|
|
Регистрация: 14.08.2018
Сообщений: 65
|
|
Я пытался изменять id при добавлении в корзину в map(), но мне не удалось..
|
|
24.10.2019, 19:10
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
Сообщение от Marson
|
Я пытался изменять id при добавлении в корзину
|
Их вообще нет необходимости менять, это единожды и навсегда данный товару уникальный идентификатор. Понимаете, уникальный! Допустим есть на странице 10 товаров, и каждый из них имеет, должен иметь, уникальный идентификатор. А значит и в корзине каждый товар будет под своим уникальным ID! А извлеченные из корзины данные для операции над ними, это будет объект, где идентификаторы товаров могут быть его свойствами, и ничто не будет утеряно, не будет конфликтов, так как и свойства объекта не будут повторяться.
Не в корзине нужно пытаться наводить порядок, наведите порядок в своей базе так, чтобы ID у каждого товара было уникальное. Например, если база это MySQL и подобная, то ID должен храниться в поле с автоинкрементом, иметь первичный ключ.
|
|
24.10.2019, 20:02
|
Аспирант
|
|
Регистрация: 14.08.2018
Сообщений: 65
|
|
Я понял, что они уникальные. Спасибо, вы мне донесли это)
|
|
05.08.2022, 00:27
|
Новичок на форуме
|
|
Регистрация: 05.08.2022
Сообщений: 1
|
|
Marson,
Как вы решили проблему?
|
|
|
|