2014-04-04 23 views
1

以下函數將用戶輸入用於用戶所選範圍的開始和結束課程,然後使用循環從數組中抽取每個課程數組,然後隨機拼接它變成一個新的陣列。例如,選擇課程3到5的最終結果是新數組(randArray)包含隨機化範圍內的每個課程的所有數據,前三個,然後四個,然後是五個。這一切都很好,但我可以想象,這可能不是最有效的方法。從現有數組的子集創建新數組的最緊湊和有效的方式是什麼?既然它運作良好,我很滿足,但是會學習更好的方法,並知道它們爲什麼更好(除了更緊湊)之外,它會着迷。我選擇了這種方法,因爲在一個數組中使用單個課程已經有很多代碼,這讓我可以在不改變任何其他代碼的情況下爲該數組添加一系列課程。actionscript:從許多數組中組裝一個新數組

function initializeRange():void { 
    for (i = startLesson; i < (endLesson + 1); i++) { 
     switch (i) { 
      case 1: 
       duplicate = elementArray[i].slice(0); 
       while (duplicate.length > 1) { 
        randArray.push(duplicate.splice(Math.ceil(Math.random() * 
        (duplicate.length - 1)), 1)[0]); 
       } 
       break; 
      case 2: 
       duplicate = elementArray[i].slice(0); 
       while (duplicate.length > 1) { 
        randArray.push(duplicate.splice(Math.ceil(Math.random() * 
        (duplicate.length - 1)), 1)[0]); 
       } 
       break; 
      case 3: 
       duplicate = elementArray[i].slice(0); 
       while (duplicate.length > 1) { 
        randArray.push(duplicate.splice(Math.ceil(Math.random() * 
        (duplicate.length - 1)), 1)[0]); 
       } 
      break; 
      //case "etc.": 
      //and so on for the rest of the lessons  
     } 
    } 
} 
+0

您需要使用'Math.floor()'而不是'Math.ceil()',否則數組的第一個元素將永遠不會進入結果數組。否則,你的方法很好。 – Vesper

回答

0

您可以使用push.apply,或concat

他們都在做同樣的事情 - 添加元素到特定的數組,提供另一個數組的子集。無論哪種方式,您必須選擇(splice)您需要添加的子集。

這兩種方法更好,因爲您不需要遍歷所有項目(可能是成千上萬)。

相關問題