表示多个数组的唯一索引的数字

Number that represents the unique index of many arrays

本文关键字:唯一 数字 索引 数组 表示      更新时间:2023-09-26

我有一个应用程序,它接受多个数组的数据,每个数组的长度都是可变的。我计划循环并显示我给出的每个数组的每个数据组合。我的第一个想法是用一个数字来表示每个数组的状态,因为我知道组合的数量是每个数组元素数量的乘积。

例如:

A = [0,1,2,3]

B = [0,1,2,3]

C = [0,1]

所以我需要表示4 x 4 x 2 = 32种组合

我已经设法通过使用每个数组长度对给定索引应用模和除法来表示所有状态。我的问题是它不能很好地排序(参见下面的代码片段)。有没有人解决了类似的问题,或者知道我如何改变算法来得到它的顺序?

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--){
	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的文档更新从这里开始应该是微不足道的。