我正在尝试从数组中删除所有数字。循环完全按照我的要求工作,但是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']
答案 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
所以我们可以使用过滤器仅删除数字