如何在JavaScript中同时从不同索引处删除多个数组元素?

4
我有一个整数数组,我正在使用.push()方法添加元素。
我知道splice()方法可以向数组中添加/删除项,并返回已删除的项。
但是是否有一种方法可以同时从不同索引处从数组中删除多个元素?
我知道我们也可以使用filter()方法,但是filter()方法会创建一个新数组,其中包含通过提供的函数实现测试的所有元素,这不是我想要的。
例如:
var array = [1,2,3,4,5];

我知道如果要移除3和5,可以按照以下步骤进行:
  1. array.splice(2, 1);
  2. array.splice(3, 1);
但是,我是否可以在不使用splice()方法两次的情况下一次性完成此操作?

1
@Rajesh 请阅读并理解问题。 - Gaurav joshi
你想根据它们的还是索引来删除项目? - nnnnnn
你是指 array.splice(4, 1); 吗? - guest271314
@guest271314 - 不要删除值5,因为第二个.splice()运行时,值5在索引3处。 - nnnnnn
1
@guest271314 - 不,array.splice(2,2)会删除值3和4。OP想要删除值3和5,而所示的代码确实做到了这一点。正如我之前所说,在第二个.splice()运行之前,索引已经发生了变化。 - nnnnnn
显示剩余7条评论
4个回答

3
如果您知道要删除的确切值,可以使用array.filter()

这将同时从数组中不同索引处删除多个元素。

以下是您的示例:

var filtered = [1,2,3,4,5].filter(value => { return value !== 3 && value !== 5 });

console.log(filtered)


请注意 <> 图标。您可以使用它添加代码片段。 - Rajesh
@nnnnnn 不好意思 :-) - Rajesh
1
@DeividasKaržinauskas 是的,我们可以通过过滤器来实现这一点,但是 filter() 方法会创建一个新的数组。 - Gaurav joshi
@Gauravjoshi,用新数组替换原始数组对你来说行不通吗? - Deividas
随着函数式编程和不可变对象变得越来越流行,我们正在学习创建新数组是更好的工作方式。@Gauravjoshi - slim
显示剩余3条评论

3
你可以在解构赋值中使用尾随逗号来选择数组中的特定元素,将结果值赋给原始数组引用。

var array = [1,2,3,4,5];
{let [a,b,,c,,] = array; array = [a,b,c]};

console.log(array);

你可以在数组上使用对象解构来获取特定索引的值。

var array = [1,2,3,4,5];
{let {0:a,1:b,3:c} = array; array = [a,b,c]};

console.log(array);

你也可以使用 .forEach() 来迭代一个元素的数组来匹配,.indexOf().splice() 来删除与数组中元素值匹配的元素。

var array = [1,2,3,4,5];
[3, 5].forEach(p => array.splice(array.indexOf(p), 1));

console.log(array);

Using for..of loop, Array.prototype.findIndex(), Array.prototype.splice()

var array = [1,2,3,4,5];
var not = [3, 5];
for (let n of not) array.splice(array.findIndex(v => v === n), 1);

console.log(array);

使用for..of循环与Array.prototype.entries()Array.prototype.some()Array.prototype.splice()来操作数组

var array = [1,2,3,4,5];
var not = [3,5];
for (let [k, p] of array.entries()) not.some(n => !(n-p)) && array.splice(k, 1);

console.log(array);

您也可以使用for循环,Object.assign()设置要在数组开头保留的索引,然后调用参数设置为-要从数组中删除的元素数量的.splice()

var array = [1,2,3,4,5];
var not = [3,5];
for (var o = {}, k = -1, i = 0; i < array.length; i++) {
  if (!not.some(n => n === array[i])) o[++k] = array[i];
}
Object.assign(array, o).splice(-not.length);

console.log(array);

使用Array.prototype.reduce()Object.assign()进行操作。

var array = [1,2,3,4,5];
var not = [3,5];
Object.assign(array, array.reduce(([o, not, k], p) => 
  [Object.assign(o, !not.some(n => n === p) ? {[++k]:p} : void 0), not, k]
  , [{}, not, -1]).shift()
).splice(-not.length);

console.log(array);

如果这些数字是唯一的,另一个选择是使用Set.delete()方法,使用解构赋值中的rest语法将Set对象转换为Array数组。

var array = new Set;
var not = [3, 5];
for (let n = 1; n <= 5; n++) array.add(n);

for (let n of not) array.delete(n);
[...array] = array;

console.log(array); // `array = new Set(array)`


1
当您知道需要删除的特定值并且数组较小的时候,请硬编码:

var array = [1,2,3,4,5,6,7];
array.splice(2,3,4);
console.log(array);


1
也许你可以像这样在原地进行操作;

var          arr = [1,2,3,4,5,17,23,37,61,15],
itemsToGetRidOff = [3,17,15,1,23];
arr.reduceRight((_,e,i,a) => itemsToGetRidOff.includes(e) && a.splice(i,1),[]);
console.log(arr);


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接