2017-05-14 36 views
-2

我確定這已經回答了某個地方,但我找不到對於純JS的這個特定問題的答案。
我需要這樣的功能:JS - 通過給定數組創建可能的陣列循環

function testAllPossibilities(array, callback) { 
    //example array = [Obj1,Obj2]; 
    //allPossibilites = [[Obj1],[Obj2],[Obj1,Obj2],[Obj2,Obj1]] 
    for (var i = 0; i < allPossibilites.length; i++) { 
     callback(allPossibilites[i]); 
    } 
} 

我不知道如何產生allPossibilities變量,我還不夠了解所有這些數學術語如「置換」等精確定義這個問題......這可能是我迄今爲止找不到答案的原因。

一些更多的單詞到allPossibilities
應該有用於每個不同的順序的可能性,長度應爲1和陣列的長度之間,但沒有相同元件的重複。

+0

所以,如果你有一個'[1,2,3]'的數組,你需要什麼組合? –

+0

'[1],[2],[3],[1,2],[2,1],[1,3],[3,1],[2,3],[3,2], [1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]' –

+0

讓我明白了這一點 - 你想排列組合,但你不想學習排列組合? – 2017-05-14 13:01:17

回答

1
function combinate (array) { 
    const possibilities = new Set(); 

    function lookup (possible) { 
    if possible.length { 
     possibilities.add(possible); 
    } 

    const p = new Set(possible); 
    const further = array.filter(el => !p.has(el)); 

    for (let entry of further) { 
     lookup(possible.concat(entry)); 
    } 
    } 

    lookup([]); 

    return Array.from(possibilities); 
} 

不要使用超過8個元素運行此操作。

+0

謝謝,它給了我迄今爲止的結果! 以後我會研究你的代碼,看看你是如何做到的 - 我從來沒有使用'Set'和'let',我肯定會從你的解決方案中學到很多東西! :) –