Javascript js数组使用destructuring/rest语法按值删除元素

Javascript js数组使用destructuring/rest语法按值删除元素,javascript,arrays,destructuring,rest-parameters,Javascript,Arrays,Destructuring,Rest Parameters,对我来说似乎很直观,但事实证明事情并非如此!目标是删除传递的元素(如果存在),并返回剩余的元素。我知道有很多方法可以实现这一点,包括filter:const rest=selection.filteri=>I!==item——但是,正如我所说的,我认为这种方法将是一种东西——就像对象/键:值对一样 解构的工作方式是将第一个选择元素分配给项,并将其余项分配给rest—一个数组。这是正确的——至少从我的理解来看,事情就是这样的。 将项的值注入到分解赋值中,而不必将其视为包含数组第一个元素的新变量,这

对我来说似乎很直观,但事实证明事情并非如此!目标是删除传递的元素(如果存在),并返回剩余的元素。我知道有很多方法可以实现这一点,包括filter:const rest=selection.filteri=>I!==item——但是,正如我所说的,我认为这种方法将是一种东西——就像对象/键:值对一样

解构的工作方式是将第一个选择元素分配给项,并将其余项分配给rest—一个数组。这是正确的——至少从我的理解来看,事情就是这样的。
将项的值注入到分解赋值中,而不必将其视为包含数组第一个元素的新变量,这种可能性有多大?

这里有一种奇怪的方法:

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,所以第二个项是不同的,但是可以删除const并将表达式括在括号中,以便按照我认为您最初要求的那样重新分配项:

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 {
  // ...
}
但是,如果您想在不使用过滤器的情况下遵循类似的模式,可以使用拼接:


与过滤器相比,这些都不是特别吸引人的,但它应该说明这些方法是如何工作的。

这里有一种奇怪的方法:

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,所以第二个项是不同的,但是可以删除const并将表达式括在括号中,以便按照我认为您最初要求的那样重新分配项:

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 {
  // ...
}
但是,如果您想在不使用过滤器的情况下遵循类似的模式,可以使用拼接:


与过滤器相比,这些都不是特别吸引人的,但它应该说明这些方法是如何工作的。

使用过滤器。你试图用解构来做什么是不可能的。你可以做一个难看的黑客:,但不要用它:p证明这是可能的,如@NickParsons和Brett Zamir所示-缺点是它需要更多的工作-至少在当前的实现中是如此。@Omkar76我肯定使用了过滤器-只是认为可以有一种更优雅的方式。我也不想在我收到来自community@colinwagaba,我明白你的意思。我没有考虑将数组分解为对象。我知道我应该更小心地说下次不可能=使用过滤器。你试图用解构来做什么是不可能的。你可以做一个难看的黑客:,但不要用它:p证明这是可能的,如@NickParsons和Brett Zamir所示-缺点是它需要更多的工作-至少在当前的实现中是如此。@Omkar76我肯定使用了过滤器-只是认为可以有一种更优雅的方式。我也不想在我收到来自community@colinwagaba,我明白你的意思。我没有考虑将数组分解为对象。我知道下次我应该更小心地说不可能=