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);          
   }
}

splice メソッドが値の位置に影響しているようです。

私が必要だと思うこの解決策(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)が返さNaNれ、isNaN(value)が返さtrueれ、その逆も同様です。また、およびであるため、どちらのアプローチもnullIDを除外しないことに注意してください。結果からエントリを除外する場合は、個別にテストする必要があります。)Number(null)==0isNaN(null)==falsenull

于 2013-04-11T01:38:45.677 に答える