如何在if语句中正确使用array.splice()过滤数组中的非字符串元素
正确移除数组中数字类型元素的方法(使用splice)
你的代码有两个核心问题导致数字元素无法被删除:
1. splice方法参数使用错误
array.splice(array[i]) 是错误的用法,splice 的标准语法是 array.splice(startIndex, deleteCount):
- 第一个参数是要删除元素的索引位置,不是元素的值
- 第二个参数是要删除的元素数量,这里我们要删除单个元素,所以传
1
2. 正向遍历的索引偏移问题
当你在正向遍历中删除元素时,数组长度会缩短,后续元素会向前移位。如果不调整索引值,会跳过移位后的下一个元素(比如连续多个非字符串元素时,第二个会被跳过)。
修正方案1:正向遍历,删除后调整索引
var inputFunction = function filterOutNumbers(array) { for (var i = 0; i < array.length; i++) { if (typeof array[i] !== 'string') { // 传入索引i和删除数量1 array.splice(i, 1); // 删除后索引减1,避免跳过移位后的元素 i--; } } return array; } var inputArray = ['only', 'words', 'go', 'in', 78, 'here'] var output = inputFunction(inputArray); console.log(output); // 输出 ['only', 'words', 'go', 'in', 'here']
修正方案2:倒序遍历(无需调整索引)
从数组末尾往前遍历,删除元素不会影响未遍历到的元素索引,更省心:
var inputFunction = function filterOutNumbers(array) { for (var i = array.length - 1; i >= 0; i--) { if (typeof array[i] !== 'string') { array.splice(i, 1); } } return array; } var inputArray = ['only', 'words', 'go', 'in', 78, 'here'] var output = inputFunction(inputArray); console.log(output); // 输出 ['only', 'words', 'go', 'in', 'here']
补充:更简洁的非splice方案(filter方法)
如果不需要修改原数组,而是返回新数组,可以用filter方法实现,代码更简洁:
var inputFunction = function filterOutNumbers(array) { return array.filter(item => typeof item === 'string'); }
内容的提问来源于stack exchange,提问作者Matthew Slonoff
相关产品推荐
相关产品推荐

