循环遍历多个数组,将它们合并成一个数组,同时保持子数组内的索引。

6

这个标题有点长,但我会尽量解释我的意思。基本上,我有几个数组,我想要将它们合并成一个数组。问题在于,我需要循环遍历子数组中的项目,并逐个添加它们并保持顺序。最终目标是我想要返回分页后的数据。下面是一个简单的示例,我将使用它来试图传达我的意思。这不是按字母顺序排序,例如底部示例中h不应在i之前。

所以在我的例子中,我知道我想要3页结果。第一页应该有4个项目,第二页4个项目,第三页只有1个项目。

我可以自己完成最终的分页,因为我最终会有一个所有内部项目的数组"mix",但我无法弄清楚如何循环遍历我的数组并按照我需要的方式添加它们。

我已经有了页面变量,但我不确定如何构造循环。我认为我基本上需要循环遍历每个子数组并pop()掉第一个项目,然后循环遍历下一个子数组,pop()掉第一个项目,依此类推。但是我需要检查每个子数组中剩余的项目数量。

例如,如果我只有数组"one",理论上我会有2页,第一页包含a、c、e、i,第二页只有k,这个很简单,因为我只需要检查一个数组的长度。

但是如果我添加了另一个数组"third" [1,2,3,4,5],那么我希望混合数组是['a','b',1,'c','d',2...等];每个这些数组理论上都可能具有不同的长度,因此我显然会跳过一个空值。

 var one = ['a','c','e','i','k'];
 var two = ['b','d','f','h'];

 var all = [one,two];
 var pagecount = 3;
 var mix = [];

 for(var i = 0; i< all.length; i++){
     var area = all[i];    
 }
 // End result should be mix = ['a','b','c','d','e','f','i','h','k'];

我尽力用最好的措辞来表达,但是我很难自己解释清楚这个问题!不幸的是,在现实世界中,我无法控制数据/数据数组的大小。

如果有任何问题或者有什么不清楚的地方,请留言评论。

3个回答

3
以下内容应该有效:
for (var i = 0; all.length !== 0; i++) {
    var j = 0;
    while (j < all.length) {
        if (i >= all[j].length) {
            all.splice(j, 1);
        } else {
            mix.push(all[j][i]);
            j += 1;
        }
    }
}

在外部循环的每次迭代中,我们将i加1,这将是从每个数组中获取项的索引。对于内部循环,我们将执行以下操作之一:
  • 如果索引i超出了数组all[j]的最大索引,则我们已完成该数组,因此使用all.splice(j, 1)将其删除。我们不会推进j,因为all [j]将指向在该位置之后删除前一个元素后的下一个数组。
  • 否则,我们将项目all[j][i]添加到mix中,并将j增加1以在下一次迭代中移动到下一个数组。

只有当i超过最长数组的长度时,外部循环才会停止,此时all中没有剩余的数组。

例如,有三个长度不同的数组:
var one = [1, 2, 3, 4];
var two = ['a', 'b'];
var three = ['U', 'V', 'W', 'X', 'Y', 'Z'];
var all = [one, two, three];
var mix = [];
// after running the above loop mix will have the following contents:
// [1, "a", "U", 2, "b", "V", 3, "W", 4, "X", "Y", "Z"]

如果您想在one[i]之前“Foo” /之后“bar”,该怎么做呢?输出将是:[foo1bar,“a”,“U”,foo2bar,“b”,“V”,foo3bar,“W”,foo4bar,“X”,“Y”,“Z”] ... 您能否更改为“var all = [“ foo”+ one +“bar”,two,three];” - hakarune

2

在外部循环中遍历内部索引,在内部循环中遍历数组:

for (var i = 0, cont = true; cont; i++) {
  cont = false;
  for (j = 0; j < all.length; j++) {
    if (i < all[j].length) {
      mix.push(all[j][i]);
      cont = true;
    }
  }
}

1
似乎您需要一个简单的合并函数。您可以像这样完成它。
var one = ['a','c','e','i','k'];
var two = ['b','d','f','h'];
var mix = new Array();
var merging = true;
var index = 0;
while (merging) {
    merging = false;
    if (index < one.length) {
        mix[mix.length] = one[index];
        merging = true;
    }
    if (index < two.length) {
        mix[mix.length] = two[index];
        merging = true;
    }

    // add if blocks for arrays three, four, etc...

    index++;
}

这可以通过在循环内部添加另一个 if 块来扩展任意数量的数组。

我其实更喜欢其他的答案哈哈。只是因为我们在计算机科学课程中必须证明它的正确性,所以我立刻想到了这个答案。至少我知道它是可行的 :) - jonhopkins

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接