使用JavaScript从数组中删除零值

15

我有一个名为"ids"的数组,其中包含一些值,如['0','567','956','0','34']。现在我需要从该数组中删除“0”值。 ids.remove("0")无法起作用。

我需要使用以下代码将数组中的所有“0”值删除:

ids = [value for value in ids if value != '0']

3
好的,“Array.prototype.remove”并不存在,所以它无法工作 ;) - Felix Kling
9个回答

18

这是一个函数,可以删除数组中特定值的元素,而不会在两个连续元素具有相同值时失败:

function removeElementsWithValue(arr, val) {
    var i = arr.length;
    while (i--) {
        if (arr[i] === val) {
            arr.splice(i, 1);
        }
    }
    return arr;
}

var a = [1, 0, 0, 1];
removeElementsWithValue(a, 0);
console.log(a); // [1, 1]

在大多数浏览器中(除了IE <= 8),你可以使用数组对象的filter()方法,但是请注意,这会返回一个新的数组:

a = a.filter(function(val) {
    return val !== 0;
});

你也可以直接使用 return val; - Brian Leishman
1
如果你的数组成员都保证是数字,那么是的,但通常情况下并不完全相同:使用 return val 会过滤掉任何 false 值,比如 false 或者空字符串,而不仅仅是 0 - Tim Down
是的,这个例子特别,我想既然你用了 !==,在这里使用它是有意义的。 - Brian Leishman

15

使用 JavaScript 中的 splice 方法。尝试使用以下函数:

function removeElement(arrayName,arrayElement)
 {
    for(var i=0; i<arrayName.length;i++ )
     { 
        if(arrayName[i]==arrayElement)
            arrayName.splice(i,1); 
      } 
  }

参数如下:

arrayName:-      Name of the array.
arrayElement:-   Element you want to remove from array

什么是1。我认为在我的情况下需要使用“0”而不是“1”,对吧? - vissu
@vissupepala:不是的。请阅读文档:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/splice 。它的意思是从索引“i”开始删除1个元素。 - Felix Kling
不是的。这是你想要删除的元素数量。你需要在arrayElement中传递0 - Harry Joy
12
如果数组中有连续的两个零,那么它将失败。 - Tim Down
3
@TimDown 是正确的,你需要在 if 语句中加上 i-- 才能解决这个问题。 - blex
循环遍历数组并删除其中的元素,而不中断循环。 - adiga

14

以下是一种实现方式:

const array = ['0', '567', '956', '0', '34'];
const filtered = array.filter(Number);

console.log(filtered);


1
类型错误:0不是一个函数。 - 1.21 gigawatts

5

对于ES6最佳实践标准:

let a = ['0','567','956','0','34'];


a = a.filter(val => val !== "0");

请注意,您数组中的"id"是字符串,如果要检查其类型,请编写"!="。


4

对于非常大的数组,构建一个新数组仍然比splice或filter快得多。

var new_arr = [],
tmp;

for(var i=0, l=old_arr.length; i<l; i++)
{
  tmp = old_arr[i];

  if( tmp !== '0' )
  {
    new_arr.push( tmp );
  }
}

如果你使用splice,请逆向迭代!


2
ids.filter(function(x) {return Number(x);});

2
以下代码可以解决你的问题。
 for(var i=0; i<ids.length;i++ )
 { 
    if(ids[i]=='0')
        ids.splice(i,1); 
  } 

它简单易懂,也解决了问题。谢谢。 - vissu
4
如果数组中有连续的两个零,那么这个方法会失败。 - Tim Down

2
我相信,最短的方法是:
var newList = ['0', '567', '956', '0', '34'].filter(cV => cV != "0")

你总是可以这样做,

listWithZeros = ['0', '567', '956', '0', '34']
newList = listWithZeros.filter(cv => cv != "0")

newList 包含您所需的列表。

说明

Array.prototype.filter()

该方法通过测试条件函数过滤掉项目并返回一个新的数组。
它接受一个可能带有3个参数的函数。
语法:
Array.prototype.filter((currentValue, index, array) => { ... })

这里的参数是自解释的。

在这里阅读更多。


0

最简单的方法是使用splice!但是有一个问题,每次删除一个元素时,数组的大小将不断减少。因此,循环会跳过1个索引,导致数组大小减小。

这个程序只会移除每个第一个零。

// Wrong approach
let num = [1, 0, 0,  2, 0, 0, 3,];

for(let i=0; i<num.length; i++){
    if(num[i]==0)
        num.splice(i, 1);
}
console.log(num)

输出结果将会是:

[1,0,2,0,3]

因此,要删除所有的零,您应该在找到非零数字时增加索引。

let i = 0;
while(i<num.length){
    if(num[i]==0){
        num.splice(i,1);
    }
    else{
        i++;
    }
}

但有更好的方法。由于更改数组大小只会影响数组的右侧,因此您可以反向遍历并进行拼接。

for(let i=num.length-1; i>=0; i--){
    if(num[i]===0)
        num.splice(i,1);
}

1
欢迎来到Stackoverflow。这个问题已经被提出超过9年了,并且已经有一个被接受的答案。被接受的答案也使用了split。请在你添加新答案时加入一些详细信息说明原因。 - MD Zand

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