Удалить объект из массива?
Удалить объект из массива не работает должным образом, но он отлично добавляет объект
const addItem =(selected)=>{
let data = selectedItems ? [...selectedItems] : [];
if (data.length) {
let index = data.indexOf(selected);
console.log(index);
if (index !== -1) {
data.splice(index, 1);
setSelectedItems(data);
} else {
data.push(selected);
}
} else {
data.push(selected);
}
console.log("selected", selectedItems);
setSelectedItems(data);
}
функция кнопки рендеринга добавить или удалить при нажатии на нее
<div className="file-list">
<MappedElement
data={[{ _id: 1 }, { _id: 2 }]}
renderElement={(value, index, arr) => {
let check=selectedItems.some((obj) => obj._id === value._id);
console.log("check", check);
return (
<DocumentCard key={index} className={file-list-item ${check ?
"active" : ""}}
onClick={() => addItem(value, arr, index)} /> ); }} />
</div>
3 ответа
Для selectedItems
массив, который выглядит так:
const selectedItems = [
{ _id: 1, /* other fields */ },
{ _id: 2, /* other fields */ },
{ _id: 3, /* other fields */ },
/* other objects */
];
И selected
объект, который выглядит так:
const selected = { _id: 1 };
Чтобы выполнить желаемое поведение, а именно: если элемент существует, удалите его, иначе добавьте его, вы можете написать следующее:
// copy selected items with a fail-safe empty array
const data = selectedItems ? [...selectedItems] : [];
// find index of selected element
const removalIndex = data.findIndex(({ _id }) => (_id === selected._id));
// if selected element exists in data array, remove it
if (removalIndex !== -1) {
data.splice(removalIndex, 1);
}
// if selected element doesn't exist in data array, add it
else {
data.push(selected);
}
// update selected elements
setSelectedItems(data);
ПРИМЕЧАНИЕ: если ваш массив выбранных элементов содержит дубликаты, то есть несколько объектов, которые содержат одно и то же значение для_id
, то этот подход удалит только первый из них. Если вы хотите удалить их все, вам придется использовать цикл или рекурсивность.
Использовать
const addItem =(selected)=>{
let data = selectedItems ? [...selectedItems] : [];
if (data.length) {
let index = data.findIndex(value => value._id === selected._id)ж
console.log(index);
if (index !== -1) {
data.splice(index, 1);
} else {
data.push(selected);
}
} else {
data.push(selected);
}
console.log("selected", selectedItems);
setSelectedItems(data);
}
Вероятно, ваша проблема в indexOf
метод, который вы используете.
Вы не можете использовать это для поиска объектов в вашем массиве.
Вы можете использовать несколько вариантов. Вы можете использовать find или findIndex и передать обратный вызов, чтобы найти объект по указанному (предпочтительно уникальному свойству объекта).
пример
let found = data.findIndex(item => item.id === selected.id);