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 можно рассматривать как объекты.

Как вы можете видеть здесь:

Другие вопросы по тегам