仅返回数字并从JavaScript中的现有数组中删除字符串?

时间:2018-10-28 23:46:49

标签: javascript arrays string integer

我在许多类似的问题中进行了搜索,但是找不到这个棘手的问题的答案。 我需要一个从数组中删除所有不是数字的项目的函数。但是函数应该修改现有数组,而不是创建一个新数组。 我试图做这样的事情:

 let array = [1, 'a', 'b', 2];
 array = array.filter(item => typeof item !== "string");
 console.log(array);

 //--> [1, 2]

虽然我得到了正确的结果,但我在其他方面进行了测试,因为根据MDN,结果创建了一个具有正确结果的新数组,而我对此忽略了,也不完全知道。

在解决这些问题上,有没有人比我有更多的经验,从我的想法出发,我试图用array.splice和for loop做几个小时,但几乎没有成功。在此先感谢您,对不起对于长篇文章。

3 个答案:

答案 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,则不会增加指针。