如何通过值从数组中删除项目?

1368

有没有一种方法可以从 JavaScript 数组中移除一个元素?

给定一个数组:

var ary = ['three', 'seven', 'eleven'];

我想要做类似这样的事情:

removeItem('seven', ary);

我研究了splice(),但那只能按位置号删除,我需要一种可以按值删除项目的方法。


123
Array.filter() 翻译为 "数组过滤",它是 JavaScript 中的一个数组方法。该方法可用于创建一个新数组,其中包含原始数组中满足特定条件的所有元素。使用该方法需要提供一个回调函数,该函数接受三个参数:当前元素、元素索引和数组本身。回调函数应返回一个布尔值,指示当前元素是否应包含在新数组中。 - Eric Hodonsky
它也可以在这里找到:https://dev59.com/CG025IYBdhLWcg3w1ZoL#21408685这是基准测试:https://jsperf.com/array-without-benchmark-against-lodash - Ardi
我认为从数组中删除元素的最干净的方法是使用数组的ary.filter()方法。ary.filter(val => val !== 'seven')。这将返回一个新数组,其中包含除了“seven”之外的所有元素。 - Ali Raza
ary.splice(ary.indexOf(ID),1)只需使用这个简单的代码行就可以完成! - undefined
显示剩余3条评论
37个回答

5
indexOf 是一种选项,但其实现基本上是在整个数组中搜索值,因此随着数组大小的增加,执行时间会增加。 (我猜测每个浏览器都是这样,我只检查了Firefox)。
我没有IE6可以检查,但我认为你可以在几乎任何客户端机器上以这种方式每秒检查至少一百万个数组项。 如果[array size] * [searches per second] 可能会大于一百万,您应考虑使用不同的实现。
基本上,您可以使用对象来为数组创建索引,如下所示:
var index={'three':0, 'seven':1, 'eleven':2};

任何理智的JavaScript环境都会为这样的对象创建可搜索的索引,以便您可以快速将键转换为值,无论该对象有多少属性。
这只是基本方法,根据您的需要,您可以组合几个对象和/或数组,使相同的数据在不同的属性中快速可搜索。如果您指定您的确切需求,我可以建议更具体的数据结构。

请注意,这不是关联数组,实际上是一个对象:var arr = []; arr ['zero'] = 1,arr ['one'] = 2; 等同于:{zero: 1, one: 2} - Cody

5

您可以使用Lodash_.remove函数来实现此操作。

var array = ['three', 'seven', 'eleven'];
var evens = _.remove(array, function(e) {
  return e !== 'seven';
});

console.log(evens);
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/lodash@4.17.10/lodash.min.js"></script>


4

您可以使用 without 或从 Lodashpull:

const _ = require('lodash');
_.without([1, 2, 3, 2], 2); // -> [1, 3]

3
技巧在于从数组末尾开始遍历,这样在移除元素时不会破坏索引。
var deleteMe = function( arr, me ){
   var i = arr.length;
   while( i-- ) if(arr[i] === me ) arr.splice(i,1);
}

var arr = ["orange","red","black", "orange", "white" , "orange" ];

deleteMe( arr , "orange");

现在arr的值为["red", "black", "white"]。


2

非破坏性删除:

function removeArrayValue(array, value)
{
    var thisArray = array.slice(0); // copy the array so method is non-destructive

    var idx = thisArray.indexOf(value); // initialise idx

    while(idx != -1)
    {
        thisArray.splice(idx, 1); // chop out element at idx

        idx = thisArray.indexOf(value); // look for next ocurrence of 'value'
    }

    return thisArray;
}

1

我使用了最受欢迎的选项,创建了一个函数,可以使用另一个不需要的单词数组来清理一个单词数组:

function cleanArrayOfSpecificTerms(array,unwantedTermsArray) {
  $.each(unwantedTermsArray, function( index, value ) {
    var index = array.indexOf(value);
    if (index > -1) {
      array.splice(index, 1);        
    }
  });
  return array;
}

使用方法如下:

执行以下操作:

var notInclude = ['Not','No','First','Last','Prior','Next', 'dogs','cats'];
var splitTerms = ["call", "log", "dogs", "cats", "topic", "change", "pricing"];

cleanArrayOfSpecificTerms(splitTerms,notInclude)

1
let arr = [5, 15, 25, 30, 35];
console.log(arr); //result [5, 15, 25, 30, 35]
let index = arr.indexOf(30);

if (index > -1) {
   arr.splice(index, 1);
}
console.log(arr); //result [5, 15, 25, 35]

1
请不要使用带有delete的变量 - 它会在数组中留下一个空洞,因为它不会重新索引删除项后的元素。
> Array.prototype.remove=function(v){
...     delete this[this.indexOf(v)]
... };
[Function]
> var myarray=["3","24","55","2"];
undefined
> myarray.remove("55");
undefined
> myarray
[ '3', '24', , '2' ]

1
在全局函数中,我们不能直接传递自定义值,但有许多方法如下:
 var ary = ['three', 'seven', 'eleven'];
 var index = ary.indexOf(item);//item: the value which you want to remove

 //Method 1
 ary.splice(index,1);

 //Method 2
 delete ary[index]; //in this method the deleted element will be undefined

3
不应使用“删除”(delete)这个词,因为它仅会删除数值,而不释放空间。 - akhtarvahid

0
var remove = function(array, value) {
    var index = null;

    while ((index = array.indexOf(value)) !== -1)
        array.splice(index, 1);

    return array;
};

我喜欢这种方法... 我在一道LeetCode问题中使用了这种方法。 - Gringo Jaimes

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