这是一种奇怪的方法:
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
,但它应该显示这些方法是如何工作的。