试图从数组中只删除字符串元素,但不能正确循环

时间:2015-02-06 08:32:15

标签: javascript arrays

我试图从数组中只删除字符串元素。我想创建一个循环,检查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);
        }

4 个答案:

答案 0 :(得分:2)

您正在修改您正在循环的阵列。因此,您需要在运行时修改它,以免影响您的搜索结果。

时,你不应该拼接一个数组。

您可以使用Array.filter

执行以下操作
arr = arr.filter(Number);

答案 1 :(得分:1)

您可以filter数组:

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

filter()方法创建一个包含所有传递元素的新数组   由提供的函数实现的测试。

答案 2 :(得分:1)

当你移除一个项目时,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);
        }

答案 3 :(得分:0)

您正在修改阵列。让我们来看看你的迭代。

(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'})