AS3:合并多个2d阵列 - indexOf无法正常工作

时间:2013-02-07 15:57:49

标签: actionscript-3 multidimensional-array merge indexof

我想合并多个2dim数组,其类型为[唯一编号] [修复编号] 因为我想合并它们(并且有独特的结果)我在“retArr”里面搜索是否存在数组[唯一编号]。

Array1: retArr
Array2: arg  (multiple 2dim Arrays)

// before here is an additional "for each"-loop which gives me in every iteration a "new" arg-Array.
for (var p:uint = 0; p<arg.length; p++){
  if(retArr.length ==0){
    var tmp:Array = new Array();
    tmp.push(arg[p][0]);
    tmp.push(arg[p][1]);
    retArr.push(tmp);
  }
  else{
    for(var i:uint = 0; i<retArr.length; i++){
      if (retArr[i].indexOf(arg[p][0]) == -1){
         var tmp:Array = new Array();
         tmp.push(arg[p][0]);
         tmp.push(arg[p][1]);
         retArr.push(tmp);
         break;
      }
    }
   }
}

我认为该行

if (retArr[i].indexOf(arg[p][0]) == -1)

是我的问题,因为我在retArr中获得了双重结果。 有人可以帮帮我吗?

2 个答案:

答案 0 :(得分:1)

总结:您有一个数组数组,父数组中的每个数组都有两个元素。您想要过滤掉索引0处具有重复值的所有数组。这是正确的吗?

如果是这样,问题出现在你的第二个for循环中。说这就是你在arg中所拥有的:

var arg:Array = [[0, 1], [2, 3], [2, 3]]

在第一次迭代中,retArr不包含任何内容,因此添加[0,1]并且第二个for循环不运行

在第二次迭代中,第二个for循环执行一次,因为[2,3]的第一个元素没有出现在[0,1]

现在问题出现了:在第三次迭代中,第二个for循环执行。它检查是否[0,1]包含2.它没有,所以它将它添加到retArr。它甚至从未检查[2,3]是否包含2。

你需要做的是遍历retArr的所有元素,如果根本没有匹配,那么你可以安全地添加数组。

var matchFound:Boolean = false;
for(var i:uint = 0; i<retArr.length; i++){
  if (retArr[i].indexOf(arg[p][0]) != -1){
     matchFound = true;
     break;
  }
}
if( ! matchFound) {
  var tmp:Array = new Array();
  tmp.push(arg[p][0]);
  tmp.push(arg[p][1]);
  retArr.push(tmp);
}

还有另一个问题:即使它的元素0与另一个数组的元素1匹配,你也会过滤掉一个数组。要仅过滤掉具有重复元素0的数组,请更改此

if (retArr[i].indexOf(arg[p][0]) != -1){

到这个

if (retArr[i].indexOf(arg[p][0]) == 0){

如果您这样做,它可能会更快,更简单:

if(retArr[i][0] == arg[p][0]){

答案 1 :(得分:0)

看起来应该可以通过使用拼接或连接来实现 http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/Array.html#concat%28%29

您可以将数组附加到retArr,而无需计算长度和迭代