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

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个回答

0

我尝试使用上面jbaron的函数方法,但发现我需要保留原始数组以供稍后使用,并像这样创建一个新数组:

var newArray = referenceArray;

显然是通过引用而不是值创建的,因为当我从newArray中删除一个元素时,referenceArray也被删除了。所以我决定每次都像这样创建一个新数组:

function newArrRemoveItem(array, item, newArray){
    for(var i = 0; i < array.length; i++) {
        if(array[i]!=item){
            newArray.push(array[i]);
        }
    }
}

然后我在另一个函数中这样使用它:

var vesselID = record.get('VesselID');
var otherVessels = new Array();
newArrRemoveItem(vesselArr,vesselID,otherVessels);

现在,每次执行上述代码时,vesselArr保持不变,而otherVessels数组包括除最新的vesselID元素以外的所有元素。


0

另一种变化:

if (!Array.prototype.removeArr) {
    Array.prototype.removeArr = function(arr) {
        if(!Array.isArray(arr)) arr=[arr];//let's be nice to people who put a non-array value here.. that could be me!
        var that = this;
        if(arr.length){
            var i=0;
            while(i<that.length){
                if(arr.indexOf(that[i])>-1){
                    that.splice(i,1);
                }else i++;
            }
        }
        return that;
    }
}

这又是在循环中使用indexOf(),但假设要删除的数组相对于要清理的数组较小;每次删除都会缩短while循环。


0
//This function allows remove even array from array
var removeFromArr = function(arr, elem) { 
    var i, len = arr.length, new_arr = [],
    sort_fn = function (a, b) { return a - b; };
    for (i = 0; i < len; i += 1) {
        if (typeof elem === 'object' && typeof arr[i] === 'object') {
            if (arr[i].toString() === elem.toString()) {
                continue;
            } else {                    
                if (arr[i].sort(sort_fn).toString() === elem.sort(sort_fn).toString()) {
                    continue;
                }
            }
        }
        if (arr[i] !== elem) {
            new_arr.push(arr[i]);
        }
    }
    return new_arr;
}

使用示例

var arr = [1, '2', [1 , 1] , 'abc', 1, '1', 1];
removeFromArr(arr, 1);
//["2", [1, 1], "abc", "1"]

var arr = [[1, 2] , 2, 'a', [2, 1], [1, 1, 2]];
removeFromArr(arr, [1,2]);
//[2, "a", [1, 1, 2]]

0

3
在数组中使用delete操作会在数组中留下一个“空槽”(但不会改变数组的长度array.length),这可能不是提问者或任何阅读此答案的人所期望的结果。 - keymap

-1

//感谢MarcoCI的建议,进行了编辑

试试这个:

function wantDelete(item, arr){
  for (var i=0;i<arr.length;i++){
    if (arr[i]==item){
      arr.splice(i,1); //this delete from the "i" index in the array to the "1" length
      break;
    }
  }  
}
var goodGuys=wantDelete('bush', ['obama', 'bush', 'clinton']); //['obama', 'clinton']

希望这能帮到你


5
解释即使简短也比仅仅倾倒一大块代码要好。 - j08691
不要在数组中使用 for in,这是一种不好的做法,如果有人触及了 Array 原型,你就完蛋了。 - MarcoL

-1

CoffeeScript + jQuery 变体:

arrayRemoveItemByValue = (arr,value) ->
  r=$.inArray(value, arr)
  unless r==-1
    arr.splice(r,1)
  # return
  arr

console.log arrayRemoveItemByValue(['2','1','3'],'3')

它只删除一个,而不是全部。


-1

你可以使用lodash pull函数

var ary = ['three', 'seven', 'eleven'];
_.pull(ary, 'seven'); // ['three', 'eleven']
console.log(ary)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.6.1/lodash.js"></script>


不必要地使用了JavaScript导入 - Chiaro
@Chiaro,请为我提供正确的解决方案。我会很高兴。 - Parth Raval
尽可能使用默认设置,除非您的代码库中大部分将使用该特定库。例如,在这里,您可以轻松地使用“filter”在4行代码中编写自己的方法。 - Chiaro
好的,谢谢 :-) - Parth Raval

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