我在许多类似的问题中进行了搜索,但是找不到这个棘手的问题的答案。 我需要一个从数组中删除所有不是数字的项目的函数。但是函数应该修改现有数组,而不是创建一个新数组。 我试图做这样的事情:
let array = [1, 'a', 'b', 2];
array = array.filter(item => typeof item !== "string");
console.log(array);
//--> [1, 2]
虽然我得到了正确的结果,但我在其他方面进行了测试,因为根据MDN,结果创建了一个具有正确结果的新数组,而我对此忽略了,也不完全知道。
在解决这些问题上,有没有人比我有更多的经验,从我的想法出发,我试图用array.splice和for loop做几个小时,但几乎没有成功。在此先感谢您,对不起对于长篇文章。
答案 0 :(得分:2)
您可以在Array#splice()
反向循环中使用for
由于您正在向后操作,因此删除的任何内容都不会影响您移动方向上的任何索引,因为原始元素仍然从0
到当前位置仍然存在
let array = [1, 'a', 'b', 2];
for (let i = array.length - 1; i >= 0; i--) {
if (typeof array[i] === "string") {// modify conditional as needed
array.splice(i, 1);
}
}
console.log(array);
//--> [1, 2]
答案 1 :(得分:2)
您总是可以先尝试排序,而不要循环。例如:
const array = [1, 'a', 'b', '2', 3, 2]
// sort into strings after everything else
array.sort(a => typeof a === 'string')
// splice the string parts away
array.splice(array.findIndex(i => typeof i === 'string'))
console.log(array)
//--> [1, 3, 2]
之所以起作用,是因为排序功能已经就位,并且基本上说如果第一个比较的项目是字符串,则将其推回排序。这不受您的约束,不容易发生循环错误,并具有仅调用一次splice
的好处。
但是,实际上,为什么要限制对原始数组进行突变?似乎不必要,使用filter
会使您的代码更具可读性。
答案 2 :(得分:1)
您可以使用指针和while
循环来执行此操作,该循环检查指针是否已到达数组的末尾:
let array = [1, 'a', 'b', 2, 3, 'c', 'd', 3];
let i = 0;
while (i < array.length) {
if (typeof array[i] === "string") array.splice(i, 1);
else i++;
}
console.log(array);
请注意,如果我们决定splice
,则不会增加指针。