0

我想合并多个类型为 [唯一编号] [固定编号] 的 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 得到了双重结果。谁能帮帮我?

4

2 回答 2

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]){
于 2013-02-07T19:51:57.643 回答
0

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

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

于 2013-02-07T16:21:16.893 回答