Array.prototype.splice(start[, deleteCount[, item1[, item2[, ...]]]])
ожидает индекс первого элемента, который должен быть удален (start
) и, возможно, сколько элементов следует удалить (deleteCount
).
Для start
index, мы можем использовать второй аргумент обратного вызова Array.prototype.forEach()
, который является индексом текущего элемента в коллекции.
В следующем примере используется:
- сокращенный набор данных
- обычная функция вместо вашего метода класса, просто потому, что с ней было легче работать. Вы можете просто скопировать и вставить тело функции в свой метод
deleteItem
.
const objectToRemove = { "functional_id": "grand_modele_par_10" }
const objects = {
fullCartInfo: [
{ "products": [{ "id": 12, "items": [{ "functional_id": "grand_modele_par_10" }] }] },
{ "products": [{ "id": 18, "items": [{ "functional_id": "affiches_procedure" }] }] }
]
}
function deleteItem(item) {
this.fullCartInfo.forEach((category, index) => { // the index we will use for .splice() when we've found a matching category
category.products.forEach(product => {
product.items.forEach(itemAdded => {
if (item.functional_id === itemAdded.functional_id) {
this.fullCartInfo.splice(index, 1); // remove one item only
}
});
});
});
}
deleteItem.apply(objects, [objectToRemove]);
// .apply() is only used to set the value of <this> in deleteItem and therefor simulate its behavior as a class method.
console.log(objects);
Но это будет работать только тогда, когда вы удалите только один элемент из коллекции или если вы удалите элементы с конца. В противном случае индекс .fullCartInfo.forEach(...)
будет не синхронизирован c с фактической коллекцией, которую вы только что изменили с помощью .splice()
. Например, вы удаляете первый элемент с индексом 0
, тогда массив сдвинет все элементы на один индекс влево (элемент с индексом 1 будет тогда с индексом 0, элемент с индексом 2 будет в индексе 1, ... ), но индекс в обратном вызове не будет обновлен.
Если есть вероятность, что вы удалите несколько элементов, вам следует использовать .filter()
или старый добрый for
l oop, который повторяется из от последнего к первому.
.filter()
const objectToRemove = { "functional_id": "grand_modele_par_10" }
const objects = {
fullCartInfo: [
{ "products": [{ "id": 12, "items": [{ "functional_id": "grand_modele_par_10" }] }] },
{ "products": [{ "id": 18, "items": [{ "functional_id": "affiches_procedure" }] }] }
]
}
function deleteItem(item) {
this.fullCartInfo = this.fullCartInfo.filter((category, index) => {
let keepCategory = true;
category.products.forEach(product => {
product.items.forEach(itemAdded => {
if (item.functional_id === itemAdded.functional_id) {
keepCategory = false;
}
});
});
return keepCategory;
});
}
deleteItem.apply(objects, [objectToRemove]);
console.log(objects);
for
l oop в обратном направлении
const objectToRemove = { "functional_id": "grand_modele_par_10" }
const objects = {
fullCartInfo: [
{ "products": [{ "id": 12, "items": [{ "functional_id": "grand_modele_par_10" }] }] },
{ "products": [{ "id": 18, "items": [{ "functional_id": "affiches_procedure" }] }] }
]
}
function deleteItem(item) {
for(let index = this.fullCartInfo.length - 1; index >= 0; index--) {
this.fullCartInfo[index].products.forEach(product => {
product.items.forEach(itemAdded => {
if (item.functional_id === itemAdded.functional_id) {
this.fullCartInfo.splice(index, 1);
}
});
});
}
}
deleteItem.apply(objects, [objectToRemove]);
console.log(objects);