从数组中删除项目数组

时间:2013-01-12 21:15:33

标签: actionscript-3

我想出了这个简单的片段。

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

        }

    }


}

只是想确定一个人是否有更好的“优化”和“更快”的方式来做同样的事情?

7 个答案:

答案 0 :(得分:2)

this question的已接受答案一样,您可以简化使用filterindexOf的功能。

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

这样做只会牺牲对IE8及以下版本的支持。

这是一个纯粹的javascript示例:http://jsfiddle.net/crowjonah/dfqSE/2/

答案 1 :(得分:2)

对于O(n)解而不是O(n * m),将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;

答案 2 :(得分:1)

这是否在动作脚本中有效?

for (var pos,i=0, n=b.length;i<n;i++) {
  pos = a.indexOf(b[i]);
  if (pos!=-1) a.splice(pos,1);
}

答案 3 :(得分:1)

这些答案大多数都适用于JavaScript。由于粘贴的代码看起来像AS3,我想你可能想要这样的东西。

尝试使用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

答案 4 :(得分:0)

你的实现需要O(n * m)时间,n = A.size,m = B.size。 如果先排序数组A(O(n * logn))并在数组A(O(m * logn))上使用二进制搜索,则需要O(n * logn + m * logn),即O(n * logn)如果n> m

答案 5 :(得分:0)

使用Underscore

_.difference([1,2,3,4,5,6,7,8], [6,7,8]);
=> [1,2,3,4,5]

答案 6 :(得分:0)

删除当前:

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

或b

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

pop();是删除最后一个数组项的方法,然后你需要删除项本身,使用removeChild,同时删除你给它的每个事件(a.removeEventListener(Event.ENTER_FRAME);

Pop通常用于子弹,当子弹击中敌人时,你会做两个循环

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

此代码是原始代码,可能需要进行一些编辑。