let aUsers=[{"name":"goku"},{"name":"cell"},{"name":"vegeta"},{"name":"freezer"}]
aUsers.forEach((user,i)=>{
if (user.name= = "cell" || user.name= = "freezer"){
aUsers.splice(i,1); //this causes a problem..
}
})
console.info(aUsers);
Я знаю, что должен использовать filter
, но я не знаю, как заставить мои элементы быть removed
из array
в то же время, когда мой foreach
работает.
Я бы знал, как решить эту проблему, но после запуска foreach
, возможно, есть лучший способ сделать это.
как мне это сделать?
Как ни странно, ваш пример работает - по счастливой случайности. Возможно, вы можете изменить пример, чтобы удалить два соседних элемента, например, попробуйте проверить if (user.name= = "cell" || user.name= = "vegeta")
, тогда вы действительно проиллюстрируете проблему.
Да, вы должны использовать filter
вместо forEach
:
let aUsers=[{"name":"goku"},{"name":"cell"},{"name":"vegeta"},{"name":"freezer"}]
const newUsers = aUsers.filter(user => user.name !== "cell" && user.name !== "freezer");
console.info(newUsers);
Если вы должны изменить массив на месте, выполните итерацию в обратном направлении:
let aUsers=[{"name":"goku"},{"name":"cell"},{"name":"vegeta"},{"name":"freezer"}]
for (let i = aUsers.length - 1; i >= 0; i--) {
if (['cell', 'freezer'].includes(aUsers[i].name)) {
aUsers.splice(i, 1);
}
}
console.info(aUsers);
просто любопытно :) могу я узнать, зачем повторять в обратном порядке?
Если вы этого не сделаете, вы будете изменять массив во время его повторения. Объединение элемента 1 при повторении элемента 1 означает, что следующий индекс равен 2 — то, что раньше было в 2, теперь равно 1, поэтому он не повторяется.
ааа имеет смысл ... спасибо :)
Поскольку
filter
возвращает новый массив, вы можете назначить aUsers функции фильтра.aUsers = aUsers.filter( /.../ );
.