2

このシンプルなスニペットを思いつきました。

var a:Array = new Array( 1,2,3,4,5,6,7,8);
var b:Array = new Array( 6,7,8 ) //<<<These items need to be removed from a 

public function removeItemsFromAThatAreListedInB(a:Array, b:Array )
{
    for ( var i=0 ; i< a.length ;i++)
    {

        for ( var j=0 ; j< b.length ; j++)
        {
            if ( (a[i]) == (b[j])  )
            {
                a.splice(i,1) 
            }

        }

    }


}

誰かが同じことを行うためのより良い「最適化された」「より高速な」方法を持っているかどうかを確認したいですか?

4

7 に答える 7

2

この質問に対する受け入れられた回答と同様に、関数を単純化してfilterandを使用することができますindexOf

a = a.filter(function(item) {
    return b.indexOf(item) === -1;
});

そうしても、IE8 以下のサポートが犠牲になるだけです。

純粋な JavaScript の例を次に示します: http://jsfiddle.net/crowjonah/dfqSE/2/

于 2013-01-12T21:22:40.983 に答える
2

O(n*m) ではなく O(n) ソリューションの場合、B からの値をオブジェクトに入れます。

var i, o = {};
for (i = 0; i < b.length; i++) {
  o[b[i]] = 1;
}
for (i = a.length - 1; i >= 0; i--) {
  if (o.hasOwnProperty(a[i])) {
    a.splice(i,1) 
  }
}

配列がソートされていることがわかっている場合は、それらを並列にループできます。

var i = 0, j = 0;
var r = [];
while (i < a.length) {
  if (a[i] < b[j]) {
    r.push(a[i]);
    i++;
  } else {
    if (a[i] == b[j]) i++;
    j++;
  }
}
a = r;
于 2013-01-12T21:25:07.807 に答える
1

これはアクションスクリプトで機能しますか?

for (var pos,i=0, n=b.length;i<n;i++) {
  pos = a.indexOf(b[i]);
  if (pos!=-1) a.splice(pos,1);
}
于 2013-01-12T21:57:16.417 に答える
1

アンダースコアの使用:

_.difference([1,2,3,4,5,6,7,8], [6,7,8]);
=> [1,2,3,4,5]
于 2013-01-12T21:24:03.187 に答える
1

これらの回答のほとんどは、JavaScript に関するものと思われます。貼り付けたコードは AS3 のように見えるので、このようなものが必要になると思います。

2 番目のループの代わりに Array.indexOf を使用してみてください

public function removeItemsFromAThatAreListedInB(a:Array, b:Array){
    for(var i:int = 0 ; i < b.length ; b++){ 
         var index:int = a.indexOf(b[i]); //returns -1 if the element is not found.
                                         //this method uses the strict equality to compare
         if(index != -1){         
            a.splice(index, 1); //remove the element from a
        }
    }

} 

http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/Array.html#indexOf%28%29

于 2013-01-12T22:12:33.320 に答える
0

実装には、n = A.size、m = B.size で O(n*m) 時間が必要です。配列 A を最初に並べ替え (O(n*logn))、配列 A でバイナリ検索を使用する場合 (O(m*logn))、O(n*logn + m*logn)、つまり O(n* n>m の場合

于 2013-01-12T21:23:15.380 に答える
0

電流を削除するには:

removeChild(a[i]); a.pop();

またはbで

removeChild(b[j]); b.pop();

pop();最後の配列項目を削除する方法です。その後、removeChild を使用して項目自体を削除し、指定したすべてのイベントも削除する必要があります (a.removeEventListener(Event.ENTER_FRAME);など

ポップは弾丸によく使われ、弾丸が敵に当たったときに2回ループします

for(var i:int < bulletsarray.length; i++) {
for(var j:int < var enemynumber:int = 4; j++) {
if(bulletsarray[i].hitTestObject(enemyarray[j])) {
removeChild(bulletsarray[i]);
bulletsarray.pop();
removeChild(enemy_array[i]);
}
}
}
}

このコードは未加工です。編集が必要な場合があります。

于 2013-01-12T22:27:36.150 に答える