2016-11-16 68 views
1

我有一個應用程序需要多個數據數組或每個數據長度可變。我計劃騎自行車並顯示每個數組的每個數據組合。我的第一個傾向是讓一個數字代表每個數組的狀態,因爲我知道組合的數量是每個數組的元素數量的乘積。表示許多陣列的唯一索引的數字

因此,例如:

A = [0,1,2,3]

B = [0,1,2,3]

C = [0,1]

所以4×4×2 = 32個組合我需要表示

我已經設法通過使用每個array.length施加模和分裂到一個給定的索引來表示所有狀態。我的問題是它的排序不好(請參閱下面的代碼片段)。有沒有人解決了類似的問題,或知道我可以如何改變算法以獲得它?

function multiArrayIndex(index, ...args) { 
 
    var arrays = args.slice(); 
 
    var output = []; 
 
    
 
    for (var i = 0, curIndex = index; i < arrays.length; i++) { 
 
     var curArray = arrays[i]; 
 
     var valueIndex =(curIndex % curArray.length); 
 
     output.push(curArray[valueIndex]); 
 
     curIndex = Math.ceil(curIndex/curArray.length); 
 
    } 
 
    return output; 
 
} 
 
demoP = document.getElementById("demo"); 
 
for(var i = 32; i>=1; i--){ 
 
\t demoP.innerHTML = demoP.innerHTML + i + " - " + multiArrayIndex(i, [0,1,2,3], [0,1,2,3], [0,1]) + "<br />"; 
 
}
<p id="demo"></p>

+0

「排序好」是什麼意思?你在尋找什麼? – amflare

+0

一個索引,如果遞增,將以可預測的方式遞增/遞減其中一個底層數組。所以也許如果我的片段生產 32-0,0,0 31-1,0,0 30-2,0,0 29-3,0,0 28-0,1,0 27-1 ,1,0 26-2,1,0 25-1,1,0 24-2,1,0 23-3,1,0 22-0,2,0 這是否更有意義? –

回答

0

保持指數分開將是在我看來,一個更好的辦法。

遞增的索引可以工作有點類似於我們如何在小學手工添加兩個數字 - 如果指數過大,將其設置爲零,並增加一個下一個:

var a = [0, 1, 2, 3] 
 
var b = [0, 1, 2, 3] 
 
var c = [0, 1] 
 

 
var state = { 
 
    a: 0, 
 
    b: 0, 
 
    c: 0 
 
} 
 

 
function increment() { 
 
    state.a++; 
 

 
    if (state.a >= a.length) { 
 
    state.b++; 
 
    state.a = 0; 
 
    } 
 
    if (state.b >= b.length) { 
 
    state.c++; 
 
    state.b = 0; 
 
    } 
 
    if (state.c >= c.length) { 
 
    state.c = 0; 
 
    } 
 

 
    console.log(state); 
 
} 
 

 
console.log(state);
<button onclick='increment()'>Increment</button>

基於state更新文檔應該從這裏微不足道。

+0

謝謝,這可能適用於我的用例。雖然我的一部分人仍然希望能夠在不同的狀態之間跳躍:P –

+0

您可以隨時序列化狀態,存儲並稍後更換! – Timo

+0

你是對的,我多少是這麼做的,但是增加/減少函數我只能操縱相對於我所處狀態的狀態。我可以增加n次來改變當前狀態狀態到狀態+ n。我想訪問狀態[n]。 –