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

时间:2017-06-30 17:08:28

标签: javascript arrays lodash

只要它是单个值,使用Array.splice就可以了。 假设我有一个包含10个元素的数组,并且我想删除元素2,4和8,在Array.splice(index,1)循环中使用for是一个坏主意,因为每个元素的索引在每个拼接操作后都会发生变化。

如何删除特定的数组项,然后相应地重新排列数组

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"]

3 个答案:

答案 0 :(得分:4)

有一个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处的元素,并返回已删除的元素(如果需要)。

当然,你可以使用vanilla JavaScript,向后看Nick A. mentioned并从后面删除项目。这样做的原因是因为从后面移除不会使更改length成为问题。考虑这个我要删除第1和第3个元素的例子:

[1, 3, 7, 9]

如果我要循环前进',我会删除索引1(3)处的元素,但长度将更改为3并且索引3处将没有元素!如果我要向后循环,我会删除索引3 的元素(9)。那么长度将是3,但不影响之前的任何元素,索引1处的元素仍然在索引1处,因此从后面工作中移除。

答案 1 :(得分:3)

你可以循环反转:

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

答案 2 :(得分: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' ]
相关问题