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