2014-03-31 33 views
2

我正在研究這個小應用程序,並且我有一個超過100個對象的數組,我想分組分組。棘手的部分是我希望我新創建的數組包含隨機數量的對象。例如:JavaScript - 將數組拆分爲具有隨機數的對象

初始: [ 「A0」, 「A1」, 「A2」, 「A3」, 「A4」, 「A5」, 「A6」, 「A7」, 「A8」, 「A9」, 「A10」, 「A11」, 「A12」, 「A13」, 「A14」, 「A15」, 「A16」, 「A17」, 「A18」, 「A19」]

改性: [ 「A0」, 「A1」, 「A2」],[ 「A3」, 「A4」, 「A5」, 「A6」, 「A7」],[ 「A8」],[「A9 」, 「A10」] ...

我覺得你的想法。在過去的幾個小時裏,我一直堅持這一點,但我無法弄清楚。

我希望你能幫助我! 非常感謝

+0

是否有一定數量的組想要將數組拆分成幾組? – Schickmeister

+1

每個組中還有最小最大元素數量? –

+0

是否有任何規則如何將它們分成組的數量和大小? –

回答

5

由於您沒有爲每個數組指定最小數組數或最小/最大元素,因此這裏有一個通用函數,您可以爲每個數組指定最小/最大元素。但請注意,這並不嚴格執行最小元素,事實上它可能不可能達到100%,這取決於原始數組中有多少個元素,以及隨機分配給每個數組元素的數量。例如,如果你有10個元素的原始,你做最小2最大4,你可能會最終3/3/3/1,因爲最低限度將執行,直到沒有足夠的執行。你並沒有真正給出任何「規則」。

minmax都是可選的,默認爲1。如果只指定minmax將默認爲min

還指出,由於數組是通過引用傳遞的,因此默認情況下會將原始數組「空出」。如果要保留原始數組,請取消註釋該函數中的第一行(如果選擇原型,則顯然不適用)。

function randChunkSplit(arr,min,max) { 
    // uncomment this line if you don't want the original array to be affected 
    // var arr = arr.slice(); 
    var arrs = [],size=1; 
    var min=min||1; 
    var max=max||min||1; 
    while (arr.length > 0) { 
    size = Math.min(max,Math.floor((Math.random()*max)+min)); 
    arrs.push(arr.splice(0, size)); 
    } 
    return arrs; 
} 

例子

var letters = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z']; 

// randChunkSplit(letters) 
[["a"], ["b"], ["c"], ["d"], ["e"], ["f"], ["g"], ["h"], ["i"], ["j"], ["k"], ["l"], ["m"], ["n"], ["o"], ["p"], ["q"], ["r"], ["s"], ["t"], ["u"], ["v"], ["w"], ["x"], ["y"], ["z"]] 

// randChunkSplit(letters,3) 
[["a", "b", "c"], ["d", "e", "f"], ["g", "h", "i"], ["j", "k", "l"], ["m", "n", "o"], ["p", "q", "r"], ["s", "t", "u"], ["v", "w", "x"], ["y", "z"]] 

// randChunkSplit(letters,1,3) 
[["a"], ["b", "c"], ["d", "e"], ["f", "g", "h"], ["i", "j", "k"], ["l"], ["m"], ["n", "o"], ["p", "q"], ["r"], ["s", "t"], ["u", "v", "w"], ["x", "y", "z"]] 

// randChunkSplit(letters,2,3) 
[["a", "b", "c"], ["d", "e", "f"], ["g", "h"], ["i", "j", "k"], ["l", "m", "n"], ["o", "p", "q"], ["r", "s", "t"], ["u", "v", "w"], ["x", "y", "z"]] 

// randChunkSplit(letters,2,3) 
// same thing as before, but notice how this time we end up with just 1 elem left over 
[["a", "b", "c"], ["d", "e", "f"], ["g", "h", "i"], ["j", "k", "l"], ["m", "n", "o"], ["p", "q"], ["r", "s"], ["t", "u", "v"], ["w", "x", "y"], ["z"]] 

或者,你可以把它的原型到陣,如果你想,這樣的事情:

Array.prototype.randChunkSplit = function (min,max) { 
    var arrs = [],size=1; 
    var min=min||1; 
    var max=max||min||1; 
    while (this.length > 0) { 
    size = Math.min(max,Math.floor((Math.random()*max)+min)); 
    arrs.push(this.splice(0, size)); 
    } 
    return arrs; 
} 

var letters = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z']; 

letters.randChunkSplit(1,4) 
+0

這正是我所需要的。非常感謝!! – betmenas

1

這裏有一個你可能想要做什麼框架:

var initial = ["a0", "a1", "a2", "a3", "a4", "a5", "a6", "a7", "a8", "a9", "a10"]; 
var modifiedArrays = []; 
var totalItems = 0 
var arraySize = 1 

while (totalItems < initial.length) { 
    if ((initial.length - totalItems) <= 30)} 
     arraySize = initial.length - totalItems 
     totalItems += arraySize 
    } 
    else 
    { 
     arraySize = Math.floor((Math.random()*30)+1); 
     totalItems += arraySize 
    } 

    modifiedArrays.push(initial.slice(totalItems - arraySize, arraySize + 1)); 
} 

Diclaimer:我對JavaScript很少有經驗,而且這段代碼完全沒有經過測試,所以請原諒所有錯誤。另外,這個腳本需要1到30個元素的塊。

0

我做了幾個假設,即認爲沒有一套大小陣列的量或最小尺寸。

var original = ["a0", "a1", "a2", "a3", "a4", "a5", "a6", "a7", "a8", "a9", "a10", "a11", "a12", "a13", "a14", "a15", "a16", "a17", "a18", "a19"]; 

var results = []; 

var breaker = function(arr){ 
    if(arr.length === 0){ 
     return; 
    } 
    var pieceSize = Math.floor(Math.random()*arr.length) + 1, 
     result = arr.splice(0, pieceSize); 
    results.push(result); 
    breaker(arr); 
}