js массив удаляет элемент по значению, используя синтаксис деструктурирования/остатка
Мне это казалось довольно интуитивным, но оказалось, что все работает не так! Цель состоит в том, чтобы удалить переданный элемент, если он существует, и вернуть остаток. Я знаю, что есть несколько способов добиться этого, в том числе
filter
:
const rest = selection.filter(i => i !== item)
- но, как я уже сказал, думал, что этот подход будет вещью - так как он для
objects/key:value pairs
.
if (selection.includes(item)) {
// remove if available
const [item, ...rest] = selection;
setSelection(rest)
} else {
// ...
}
Способ
destructuring
работает, это назначает
first
элемент
selection
к элементу и присваивает остальные элементы
rest
- массив. Что правильно - так все работает, по крайней мере, в моем понимании. Какова возможность «инъекции»
item
значение в присваивание деструктурирования и не нужно рассматривать его как новую переменную, содержащую первый элемент массива?
2 ответа
Вот странный способ, которым это можно сделать:
const item = 5
const selection = [3, 4, 5, 6]
const itemPos = selection.indexOf(item)
if (selection.includes(item)) {
// remove if available
const {[itemPos]: item, ...rest} = selection
// `rest` is now an object, so convert back to an array:
console.log(Object.values(rest)) // [3, 4, 6]
setSelection(Object.values(rest))
} else {
// ...
}
Так как я использовал в обоих местах, второе другое, но можно было бы удалить
const
и заключить выражение в круглые скобки, чтобы переназначить
item
(как я думаю, вы изначально просили):
let rest, item = 5
const selection = [3, 4, 5, 6]
const itemPos = selection.indexOf(item)
if (selection.includes(item)) {
// remove if available
({[itemPos]: item, ...rest} = selection)
console.log(Object.values(rest)) // [3, 4, 6]
setSelection(Object.values(rest))
} else {
// ...
}
Но если вы хотите следовать аналогичному шаблону без использования , вы можете использовать
splice
:
const item = 5
const selection = [3, 4, 5, 6]
const itemPos = selection.indexOf(item)
if (selection.includes(item)) {
// remove if available
const rest = [...selection] // Copy array if you still need `selection`; otherwise, we could just splice and pass `selection`
rest.splice(itemPos, 1)
console.log(rest)
setSelection(rest)
} else {
// ...
}
Ни один из них не является особенно привлекательным по сравнению с
filter
, но он должен показать, как будут работать подходы.
Во-первых, нам нужно знать, что массивы в JS можно рассматривать как объекты.
Как вы можете видеть здесь: