1

我有一个数组:

var productIds = new Array("1","6","7","Product-Total","ccFirst","ccLast","email","ccExpMonth","ccExpYear","billingAddress","billingCity","billingState","billingZip");

如果它不是数字,我想删除一个值:

for(var i=0; i<productIds.length; i++){
   if(isNaN(Number(productIds[i]))) {  
       productIds.splice(i,1);          
   }
}

似乎拼接方法正在影响值的位置。

我找到了这个解决方案(遍历数组并删除项目,而不中断 for loop),这是我认为我需要的,但我不知道如何为我的代码实现他们的答案。

我该如何解决我的问题?

顺便说一句,我发布了一个更详细的 jsFiddle:http: //jsfiddle.net/fte3m/2/

4

1 回答 1

5

当您删除 index 处的条目时i,您需要从中减去 1,i以便不会跳过向下移动的条目。

for(var i=0; i<productIds.length; i++){
   if(isNaN(productIds[i])) {  
       productIds.splice(i--,1);  // <-- Decrement i
   }
}

正如 RobG 在他的评论中指出的那样,在另一个方向上简单地处理数组更容易:

for(var i=productIds.length - 1; i>=0; i--){
   if(isNaN(productIds[i])) {
       productIds.splice(i,1);
   }
}

或者,如果您不介意重新分配productIds为新的数组对象并且您正在运行 JS 1.6 或更高版本:

productIds = productIds.filter(function (id) {
    return !isNaN(id);
});

(请注意,在上面,我只使用isNaN(value)而不是isNaN(Number(value))。无论何时Number(value)返回NaNisNaN(value)都会返回true反之亦然。另请注意,这两种方法都不会过滤掉一个nullid,因为Number(null)==0isNaN(null)==false。如果你想null从结果中排除条目,你会需要单独测试。)

于 2013-04-11T01:38:45.677 回答