1

私は配列を持っています:

var arr = ['A', 'B', 'C', 'D', 'E', 'F', 'G']

削除したいインデックスの配列があります。

var remove = [1, 3, 5]

結果は次のようになります:

arr ==== ['A', 'C', 'E', 'G']

ループ内のスプライスでは実行できません。

// WRONG
for (i = 0, l = remove.length; i < l; i++) {
    arr.splice(remove[i]);
}

繰り返しごとに、各要素のインデックスが変更されたためです。

では、どうすればこれを行うことができますか?

4

5 に答える 5

2
> arr.filter(function(x,i){return remove.indexOf(i)==-1})
["A", "C", "E", "G"]

より効率的にするremoveには、最初に次のようにオブジェクト/ハッシュテーブルに変換します。

var removeTable = {}
remove.forEach(function(x){removeTable[x]=true})

> arr.filter(function(x,i){return removeTable[i]})
["A", "C", "E", "G"]
于 2012-04-22T04:52:20.493 に答える
2

考えをあまり変えないために-最後から始めましょう。

ABCDEF.。

要素5を削除すると、次のようになります。

ABCDE

次に、要素3を削除すると、次のようになります。

ABCE

それはまさにあなたが望むものです。

于 2012-04-22T04:53:39.603 に答える
1

逆算:

// RIGHT
for (i = (remove.length-1); i >= 0; i--) {
  arr.splice(remove[i]);
}
于 2012-04-22T04:52:35.717 に答える
1

最後からループを開始し、最初に最も高いインデックスから要素を削除します。

于 2012-04-22T04:52:40.897 に答える
0

別の提案として、.push()保持したいアイテムを3番目の配列に送信するために使用できます。基本についてはこちらをご覧ください。これにより、元の配列をそのまま維持できますが、これを行う必要はないようです。

于 2012-04-22T05:15:52.820 に答える