2013-09-25 57 views
3

長長的標題的位,但我會試着解釋我想要做什麼。 基本上我有一些我想合併成一個數組的數組。麻煩的是,我需要遍歷子陣列中的項目,並一次添加1個項目並保持順序。最終目標是我想顯示回頁面的數據。我在下面有一個簡單的例子,我將用它來傳達我的意思。這不是字母順序排列,即h不應該在i之前。循環遍歷多個數組,合併爲單個數組,在子數組內維護索引

所以在我的例子中,我知道我想要3頁的結果。第一頁應該有4個項目,第二個頁面4個項目和第三個只有1個項目。

我可以做最後的尋呼自己,因爲我會在它「混合」到底有沒有內所有項目的數組,但我無法通過我的數組工作,如何循環和如何將它們添加我需要。

我已經得到了頁面變量,但我不知道如何構造循環。我想我基本上需要遍歷每個子數組,然後pop()關閉第一個項目,然後循環遍歷下一個,pop()第一個項目等等。但是我需要檢查每個子陣列中剩下多少物品。

例如,如果我只有數組「一」我理論上有2頁第一個包含a,c,e,我和第二個唯一的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

內塊下面應該工作只需添加另一個像這樣做

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++; 
} 

這可以爲任意數量的陣列擴展外部循環的我們通過一個增加i,這將是每個陣列中的索引從抓住一個項目。對於內環我們會做下列之一:

  • 如果指數i是超出了數組all[j]我們與該陣列這樣做它使用all.splice(j, 1)去除最大指數。我們不提前j,因爲all[j]將在刪除該位置的前一個元素後引用下一個數組。
  • 否則,我們將all[j][i]添加到mix,並將j增加1,以在下一次迭代中移動到下一個數組。

直到在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"] 
+0

如果你想在一個[i]之後的/「bar」之前「Foo」,這將如何工作?輸出將是:[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

它看起來像你想要一個簡單的合併功能。

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

在每次迭代中:您可以通過如果循環

+0

其實我喜歡其他的答案更好哈哈。我只是立即想到了這個答案,因爲我們必須在CS課程中證明它的正確性。所以至少我知道它的作品:) – jonhopkins