Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Каким способом можно удалить из корзины товары с одинаковым id (https://javascript.ru/forum/misc/78713-kakim-sposobom-mozhno-udalit-iz-korziny-tovary-s-odinakovym-id.html)

Marson 24.10.2019 15:53

Каким способом можно удалить из корзины товары с одинаковым id
 
Есть два товара id=1, id=2. Сначала добавили по id в корзину через map(), но как удалить по одному при нажатии на кнопку, если есть товары с одинаковым id? Буду признателен за любые идеи.

laimas 24.10.2019 15:56

Цитата:

Сообщение от Marson
как удалить по одному, если есть товары с одинаковым id?

А откуда одинаковые, если идентификатор, это уникальное значение?

Marson 24.10.2019 15:58

добавили три с id=1, а потом нужно удалить один

laimas 24.10.2019 16:02

Цитата:

Сообщение от Marson
добавили три с id=1

Как такое возможно?! Товары при помещении в базу автоматически могут получать уникальные идентификаторы (средствами SQL). Если все товары в одной таблице, то у всех товаров не будет одинаковых ID. Если товары разбиваются на несколько таблиц, по числу глобальных категорий, тогда у товаров может быть один и тот же ID, если в корзину поместили товары из разных категорий. Но в этом случае нужно оперировать не только ID товара, но и ID категории.

Исключите неоднозначность в идентификаторах и проблема исчезнет.

Marson 24.10.2019 16:10

Это 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});

laimas 24.10.2019 16:16

Цитата:

Сообщение от Marson
Это react:

Да пофигу, хоть Бейсик - одинаковые идентификаторы недопустимы!! Как не может иметь объект двух одинаковых свойств, а массив двух одинаковых ключей/индексов.

У вас в кармане паспорт, у него есть серия и номер. Паспорта с такой серией и номером больше ни у кого нет во всей стране. Даже если вы смените паспорт, эта серия и номер более использоваться не будет. Это суть уникальности, ибо было бы странным выставлять колье под ID 15, а спустя время под этим ID детский горшок.

Также и на страницах - недопустимо иметь на странице элементы с одинаковыми ID, ибо при обращении по такому ID будет возвращен первый найденный элемент.

И не надо искать костылей решения этой проблемы, наведите порядок с идентификацией своих товаров, это единственное и правильное решение.

PS. Если все таки нет у товаров одинаковых ID и вы не верно формулируете вопрос, и речь идет о добавлении двух единиц одного и того же товара, то в корзину не товар уже имеющийся в ней должен помещаться, а увеличиваться число выбранных.

Marson 24.10.2019 18:55

Я пытался изменять id при добавлении в корзину в map(), но мне не удалось..

laimas 24.10.2019 19:10

Цитата:

Сообщение от Marson
Я пытался изменять id при добавлении в корзину

Их вообще нет необходимости менять, это единожды и навсегда данный товару уникальный идентификатор. Понимаете, уникальный! Допустим есть на странице 10 товаров, и каждый из них имеет, должен иметь, уникальный идентификатор. А значит и в корзине каждый товар будет под своим уникальным ID! А извлеченные из корзины данные для операции над ними, это будет объект, где идентификаторы товаров могут быть его свойствами, и ничто не будет утеряно, не будет конфликтов, так как и свойства объекта не будут повторяться.

Не в корзине нужно пытаться наводить порядок, наведите порядок в своей базе так, чтобы ID у каждого товара было уникальное. Например, если база это MySQL и подобная, то ID должен храниться в поле с автоинкрементом, иметь первичный ключ.

Marson 24.10.2019 20:02

Я понял, что они уникальные. Спасибо, вы мне донесли это)

yuliiakulachko 05.08.2022 00:27

Marson,
Как вы решили проблему?


Часовой пояс GMT +3, время: 02:53.