【问题标题】:How can I loop through an arrays in javascript? [duplicate]如何在javascript中循环遍历数组? [复制]
【发布时间】:2017-05-18 21:36:43
【问题描述】:

我需要一些关于如何遍历这个可变数组大小的数组的帮助。

var x = [[1,2,3],[8],[10,11,12],[13]];

我希望结果在包含组合的数组中。

y = [[1,8,10,13],[2,8,10,13],[3,8,10,13]
,[1,8,11,13],[2,8,11,13],[3,8,11,13]....]

我希望这对我想做的事情有意义。

for(var i=0; i<x.length; i++)
{
    for(var ii=0; x[i].length; ii++)
    {
        //At this point I have x[0], but each number needs to be part of a compination 
    }
}

我最终想要做的是获取一组列表(用户设置的列表数量)并在列表中进行组合。示例 4 列出如下。

1 5  8  12
2 6  11
3 9
4 10

【问题讨论】:

  • 所以 x[i][ii] ....
  • 是 x[0][0] 是元素 y[0] 中的第一项,x[0][1] 是元素 y[1] 中的第一项
  • 所以循环和推送....
  • 我不知道如何设置循环,第二个循环将遍历 x[0] 中的所有项目。我只想要第一个项目并遍历 x 中的其余项目。实际上,我需要将 X 的每个索引视为项目列表,然后将 x 上的所有项目组合起来,而不是 x 的索引内。

标签: javascript arrays indexing


【解决方案1】:

这看起来像 cartesian product,您可以使用带有一个 for 循环的递归来执行此操作。

var x = [[1,2,3],[8],[10,11,12],[13]];

function cartesian(data) {
  var result = [];

  function generate(data, n, c) {
    if (n == data.length) {
      result.push(c.slice())
      return;
    }

    for (var i = 0; i < data[n].length; i++) {
      c[n] = data[n][i];
      generate(data, n + 1, c);
    }
  }

  generate(data, 0, [])
  return result
}

console.log(JSON.stringify(cartesian(x)))

【讨论】:

  • 非常有用。非常感谢!
  • 是函数generate尾递归吗?我不确定,因为它是在循环内调用的
【解决方案2】:
function makeCombo(x, pickFrom, soFar) {

    if (pickFrom == x.length ) {
        console.log(soFar);
        return;
    }

    for (var option = 0 ; option < x[pickFrom].length ; ++option) {
        soFar.push(x[pickFrom][option]);
        makeCombo(x, pickFrom+1, soFar);
        soFar.pop();
    }
}

makeCombo([[1,2,3],[8],[10,11,12],[13]], 0, []);

输出:

[ 1, 8, 10, 13 ]
[ 1, 8, 11, 13 ]
[ 1, 8, 12, 13 ]
[ 2, 8, 10, 13 ]
[ 2, 8, 11, 13 ]
[ 2, 8, 12, 13 ]
[ 3, 8, 10, 13 ]
[ 3, 8, 11, 13 ]
[ 3, 8, 12, 13 ]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-08-01
    • 1970-01-01
    • 2018-12-18
    • 1970-01-01
    • 2012-09-29
    • 2011-12-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多