试图从数组中只移除字符串元素,但无法向右循环

trying to remove only string element from an array but cant loop right

本文关键字:循环 元素 字符串 数组      更新时间:2023-09-26

hi-im试图只从数组中删除字符串元素。我想做一个循环,检查el是否是一个字符串,如果它是一个必须拼接的字符串。但现在它只删除了作为字符串的第一个匹配元素。为什么?

   var arr = [1,2, 'a', 'b']
    for(var i = 0; i < arr.length; i++)
        if(typeof arr[i] === "string"){
            var index = arr.indexOf(arr[i]);
                if(index > -1){
                    arr.splice(index, 1)
                }
                console.log(arr);
        }

您正在修改正在循环的数组。所以你在运行时对它进行了修改,这会影响你的结果。在遍历数组时,不应该拼接数组。

您可以使用Array.filter 执行以下操作

arr = arr.filter(Number);

您可以filter这样的数组:

arr.filter(function(item){ return typeof item !== 'string';});

filter()方法使用通过由所提供的功能实现的测试。

当您删除一个项目时,arr.length会发生变化,将您的索引1字符推到您期望的位置之前,因此您需要对其进行补偿。添加。。。

i--;

在拼接之后。像这样:

   var arr = [1,2, 'a', 'b']
    for(var i = 0; i < arr.length; i++)
        if(typeof arr[i] === "string"){
            var index = arr.indexOf(arr[i]);
                if(index > -1){
                    arr.splice(index, 1)
                    i--;                    
                }
                console.log(arr);
        }

您在原地修改数组。让我们看看您的迭代。

(i=0, type number)
[1,2,'a','b']
(i=1, type number)
[1,2,'a','b']
(i=2, type string)
[1,2,'b'] // removed 'a' at index 2
(i=3, type string)
[1,2,'b'] // there is no 4th item

我建议只使用filter()来过滤阵列:

arr=arr.filter(function(item){return typeof item != 'string'})