【问题标题】:How do I remove multiple elements from an array by index?如何按索引从数组中删除多个元素?
【发布时间】:2017-06-30 17:08:27
【问题描述】:

只要是单个值,使用 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"]

【问题讨论】:

  • 其实也不清楚,你想要什么,只是在某个索引处拼接一个元素或者移除多个元素。
  • 使用array.splice 工作正常,只需向后循环...

标签: javascript arrays lodash


【解决方案1】:

有一个 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 first (9) 处的元素。那么长度将是 3,但是 这不会影响它之前的任何元素,索引 1 处的元素仍然在索引 1 处,因此从后面移除。

【讨论】:

  • 谢谢。 “pulAt”虽然不直观。但是,是的,这正是我需要的。谢谢。
  • @NinaScholz 它可以一次删除所有不相邻的元素,因此您不需要链接会弄乱索引的拼接。
  • 哦,我明白了。应该这样做。
【解决方案2】:

你可以反向循环:

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 link
  • 按降序定义要删除的索引,你把removeFromIndex = [5,4];第一个数组将删除记录:“番茄”索引 = 4,所以现在记录“芒果”索引 = 4;番石榴 = 5;第二个数组将删除记录:“Guava”; => 删除每条记录时,数组将重新排序。
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 2016-05-20
    • 2017-03-25
    • 2018-10-31
    • 2015-04-09
    • 1970-01-01
    • 2021-11-24
    • 2010-10-12
    • 2010-10-26
    相关资源
    最近更新 更多