表示许多阵列的唯一索引的数字

问题描述:

我有一个应用程序需要多个数据数组或每个数据长度可变。我计划骑自行车并显示每个数组的每个数据组合。我的第一个倾向是让一个数字代表每个数组的状态,因为我知道组合的数量是每个数组的元素数量的乘积。表示许多阵列的唯一索引的数字

因此,例如:

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 这是否更有意义? –

保持指数分开将是在我看来,一个更好的办法。

递增的索引可以工作有点类似于我们如何在小学手工添加两个数字 - 如果指数过大,将其设置为零,并增加一个下一个:

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]。 –