繁体   English   中英

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

[英]How do I remove multiple elements from an array by index?

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

你可以循环反向:

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 演示

有一个 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. 提到的那样向后看并从后面删除项目。 这样做的原因是因为从后面移除不会使改变length成为问题。 考虑这个例子,我想删除第一个和第三个元素:

[1, 3, 7, 9]

如果我要循环“转发”,我将删除索引 1 (3) 处的元素,但长度将更改为 3,并且索引 3 处将没有元素! 如果我要循环向后虽然,我将在索引3的第一(9)除去的元素。 那么长度将为 3,但这不会影响它之前的任何元素,索引 1 处的元素仍处于索引 1 处,因此从后面的作品中删除。

您需要采取的方法是以向后的方式删除元素(不反转数组,因为这具有相同的潜在问题,即在删除时减少“尚未检查”元素的索引。

您可以使用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' ]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM