1

对我来说似乎很直观,但事实证明事情并非如此!目标是删除传递的元素(如果存在)并返回剩余部分。我知道有很多方法可以实现这一点 - 包括filterconst 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,而不必将其视为保存数组第一个元素的新变量?

4

1 回答 1

3

这是一种奇怪的方法:

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是不同的,但是可以删除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 {
  // ...
}

但是如果你想在不使用的情况下遵循类似的模式filter,你可以使用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,但它应该显示这些方法是如何工作的。

于 2021-01-06T06:55:59.953 回答