表示许多阵列的唯一索引的数字
我有一个应用程序需要多个数据数组或每个数据长度可变。我计划骑自行车并显示每个数组的每个数据组合。我的第一个倾向是让一个数字代表每个数组的状态,因为我知道组合的数量是每个数组的元素数量的乘积。表示许多阵列的唯一索引的数字
因此,例如:
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>
保持指数分开将是在我看来,一个更好的办法。
递增的索引可以工作有点类似于我们如何在小学手工添加两个数字 - 如果指数过大,将其设置为零,并增加一个下一个:
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
更新文档应该从这里微不足道。
谢谢,这可能适用于我的用例。虽然我的一部分人仍然希望能够在不同的状态之间跳跃:P –
您可以随时序列化状态,存储并稍后更换! – Timo
你是对的,我多少是这么做的,但是增加/减少函数我只能操纵相对于我所处状态的状态。我可以增加n次来改变当前状态状态到状态+ n。我想访问状态[n]。 –
“排序好”是什么意思?你在寻找什么? – amflare
一个索引,如果递增,将以可预测的方式递增/递减其中一个底层数组。所以也许如果我的片段生产 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 这是否更有意义? –