如何通过索引从数组中删除多个元素?

4

当只需要移除单个元素时,使用Array.splice是可以的。

假设我有一个包含10个元素的数组,我想要移除第2、4和8个元素。在for循环中使用Array.splice(index,1)是不好的,因为每次删除操作后,每个元素的索引都会改变。

如何移除特定的数组项,并相应地重新排列数组?

var array = ["Apple", "Banana", "Peach", "Pumpkin", "Tomato", "Mango", "Guava"];

remove(array, 4,5); //Is there a lodash function for this?

//desired result --> ["Apple", "Banana", "Peach", "Guava"]

实际上不太清楚你想要什么,是只在索引处拼接一个元素还是删除多个元素。 - Nina Scholz
2
使用 array.splice 是可以的,只需要倒序循环即可... - Nick stands with Ukraine
3个回答

8

有一个Lodash方法_.pullAt,它会从数组中(就地)删除指定的元素:

_.pullAt(array, [indexes])

array中删除与indexes对应的元素,并返回已删除元素的数组。

因此,使用如下方式:

var array = ["Apple", "Banana", "Peach", "Pumpkin", "Tomato", "Mango", "Guava"];
_.pullAt(array, [4, 5]);

如果您想从文档中提取非相邻的项目:

var array = ['a', 'b', 'c', 'd'];
var pulled = _.pullAt(array, [1, 3]);

console.log(array);
// => ['a', 'c']
这将在原地删除索引为4和5的元素,并返回已删除的元素(如果需要)。
当然,你可以使用原生JavaScript像Nick A. mentioned那样向后查找并删除元素。这种方法可行的原因是从后面删除不会影响length的值。考虑以下示例,我想要删除第一个和第三个元素:
[1, 3, 7, 9]

如果我按照正向循环,我将删除索引1(3)处的元素,但长度会变为3,并且索引3处没有元素!但是,如果我按照反向循环,我将首先删除索引3(9)处的元素。然后长度将为3,但是它不会影响它之前的任何元素,索引1处的元素仍然在索引1处,因此从后面删除可行。

谢谢。 "pullAt" 虽然不直观,但这确实是我需要的功能。谢谢。 - Divyanth Jayaraj
@NinaScholz它可以一次性删除不相邻的元素,因此您无需链接splice,这会干扰索引。 - Andrew Li
哦,我明白了。那应该可以了。 - Nina Scholz

7
你可以反向循环:
var array = ["Apple", "Banana", "Peach", "Pumpkin", "Tomato", "Mango", "Guava"],
removeFromIndex = [4,5];    
for (var i = removeFromIndex.length -1; i >= 0; i--)
    array.splice(removeFromIndex[i],1);

JSFIDDLE DEMO


那么定义要删除的索引按升序排列是很重要的吗?否则,结果数组会不同吗?[jsFiddle链接](https://jsfiddle.net/rwone/5hzfjsyv/3/) - user1063287
1
定义要按降序删除的索引,你可以将removeFromIndex = [5,4]; 第一个数组将删除记录:“西红柿”索引= 4, 所以现在记录“芒果”索引= 4;番石榴= 5; 第二个数组将删除记录:“番石榴”; =>每个记录被删除时都会重新排序数组。 - tiepnv

0
你需要采取的方法是,以反向方式删除元素(不是翻转数组,因为这与在删除时将“尚未检查”的元素索引递减具有相同的根本问题)。
你可以使用reduceRight方法,它非常类似于Reduce,但它是从(右到左)迭代数组。
以下是如何完成此操作的示例:
var array = ["Apple", "Banana", "Peach", "Pumpkin", "Tomato", "Mango", "Guava"];

let indexToRemove = [4, 5]; //We're looking to remove "Tomato" & "Mango"

array.reduceRight((_, elem, index) => {
    if (indexToRemove.includes(index)) { //Our condition(s)
        array.splice(index, 1);
    }
});

console.log(array); //Result: [ 'Apple', 'Banana', 'Peach', 'Pumpkin', 'Guava' ]

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