循环遍历多个数组,组合到单个数组,维护子数组中的索引

时间:2013-09-25 16:04:53

标签: javascript arrays

有点长篇大论,但我会试着解释一下我想做什么。 基本上我有一些我希望组合成一个数组的数组。麻烦的是,我需要循环遍历子数组中的项目,并一次添加1个并维护顺序。最终目标是我想显示返回分页的数据。我在下面有一个简单的例子,我将尝试传达我的意思。这不是按字母顺序排列的,即 h 不应该在底部示例中 i 之前。

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

我可以自己进行最后的分页,因为我将在其末尾添加所有内部项目的数组“ mix ”,但我无法弄清楚如何遍历我的数组和按我需要的方式添加它们。

我已经预先获得了页面变量,但我不确定如何构建循环。我想我基本上需要遍历每个子阵列并将第一个项目pop()关闭,然后循环遍历下一个项目,pop()第一个项目,依此类推。但在某个地方我需要检查每个子阵列中剩下多少项。

例如,如果我只有数组“一”我理论上会有2页,第一页包含a,c,e,i和第二只k,这个显然很简单,因为我只检查了它的长度只有阵列。

但是如果我在另一个数组中加入“第三个”[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 个答案:

答案 0 :(得分: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增加一,以便在下一次迭代时移至下一个数组。

外部循环不会停止,直到all中没有数组,这将在i超过最长数组的长度时发生。

例如,有三个不同长度的数组:

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"]

答案 1 :(得分: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;
    }
  }
}

答案 2 :(得分: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块

,就可以扩展任意数量的数组