我正在尝试从数组中删除所有数字。该循环完全按照我想要的方式工作,但 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']
这会做
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
相反,将返回一个新数组,如果程序中存在对该数组的其他引用,则情况会有所不同。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)