如何从数组中删除所有数字?

时间:2019-04-10 19:24:15

标签: javascript

我正在尝试从数组中删除所有数字。循环完全按照我的要求工作,但是splice()方法仍然出于某些原因跳过了一些元素。

let arr = ['1', '2', '3', '4', '5', 'notanumber', '6'];

for (let element of arr) {
  let index = arr.indexOf(element);
  let check = isNaN(element);
  if (check === false) {
    arr.splice(index, 1);
  };
};

console.log(arr);

预期输出为:['notanumber']
当前输出为:['2', '4', 'notanumber']

4 个答案:

答案 0 :(得分:5)

可以做到

arr = arr.filter(x => isNaN(x));

为每个元素调用splice的问题在于,您要在遍历数组的同时更改数组。

要手动完成filter,该方法应类似于:

let wp = 0;
for (let i=0; i<arr.length; i++) {
    if (isNaN(arr[i])) arr[wp++] = arr[i];
}
arr.length = wp;

换句话说,您保留一个“写指针” wp,对于要保留的数组中的每个元素,请将其移到适当的位置,而无需移动仍需要处理的后续元素。仅在最后调整结果的大小。这样更快(用o(N)代替o(N²)),并且更容易保持正确。

此外,第二种方法将在原处更改数组,filter将返回一个新数组,如果程序中存在对该数组的其他引用,则此方法将有所不同。

答案 1 :(得分:3)

使用此代码是因为它使用的代码比循环的代码少:

let arr = ['1', '2', '3', '4', '5', 'notanumber', '6'];
console.log(arr.filter(x => isNaN(x)))

答案 2 :(得分:3)

为什么不从头开始迭代呢?

顺便说一句,您需要索引,因为您搜索带有值的索引,如果数组中有多个相同的值,这是错误的。

那么您就需要从头开始进行迭代,这是有问题的,因为在这种情况下,拼接会使数组长度变短,而下一个索引就是实际的索引。

let array = ['1', '2', '3', '4', '5', 'notanumber', '6'],
    i = array.length;

while (i--) {
    if (!isNaN(array[i])) array.splice(i, 1);
}

console.log(array);

答案 3 :(得分:0)

您可以尝试删除所有类似的数字

let arr = ['1', '2', '3', '4', '5', 'notanumber', '6'];
arr  = arr.filter( element=> isNaN(parseInt(element)) )
console.log(arr); //output is ['notanumber']

在非数字元素中使用parseInt函数 回报将是NaN

所以我们可以使用过滤器仅删除数字