我如何使用JS将给定数组转换为其他数组?

时间:2015-12-16 12:57:42

标签: javascript

我需要一个函数和这样的要求:

  • 给定数组的维度,返回所有组合数组 给定的数字。
  • 给定数组的长度是返回数组
  • 中数组的长度
  • 组合大小是给定数组中的数字的结果 乘。例如:给定[2,2],大小为2 * 2 = 4;给[2,1,2], 大小是2 * 1 * 2 = 4。
  • 给定数组中的数字(减1)是其中的最大数 列。

我知道它不清楚,但似乎很难解释,所以看看这些例子。这样的一些例子:

given: [1, 1]
return: [[0, 0]]

given: [2, 2]
return: [[0, 0], [0, 1], [1, 0], [1, 1]]

given: [2, 3]
return: [[0, 0], [0, 1], [0, 2], [1, 0], [1, 1], [1, 2]]

given: [3, 3]
return: [[0, 0], [0, 1], [0, 2], [1, 0], [1, 1], [1, 2], [2, 0], [2, 1], [2, 2]]

given: [1, 1, 1]
return: [[0, 0, 0]]

given: [1, 1, 2]
return: [[0, 0, 0], [0, 0, 1]]

given: [2, 1, 2]
return: [[0, 0, 0], [0, 0, 1], [1, 0, 0], [1, 0, 1]]

given: [2, 2, 2]
return: [[0, 0, 0], [0, 0, 1], [0, 1, 0], [0, 1, 1], [1, 0, 0], [1, 0, 1], [1, 1, 0], [1, 1, 1]]

......

如何使用lodashImmutable或任何其他库来编写此功能?感谢。

=========== 更新 ===========

最后,我使用cartesian product of js-combinatorics和lodash解决了问题 首先,我可以轻松地将给定数组转换为某些数组:

import _ from 'lodash';

const givenArr = [2, 1, 2];
const arr = givenArr.map((v) => _.range(v)); 
console.log(arr); // [[0, 1], [0], [0, 1]]

将变换后的数组传递给js-combinatorics api:

const cp = Combinatorics.cartesianProduct([0, 1], [0], [0, 1]);
console.log(cp.toArray()); 
// [ [ 0, 0, 0 ], [ 1, 0, 0 ], [ 0, 0, 1 ], [ 1, 0, 1 ] ]

1 个答案:

答案 0 :(得分:3)

所以在更新后我实际上理解了这个问题。

至于解决方案。我认为递归方法在这里最好。我只是给出伪代码并将实现留给你:

function getAllCombinations( inputArr ) {

  if inputArr has just one element {
    return a list with all possible values
  }

  first = get the first element of the input array

  newInput = inputArr with the first element removed

  subResult = getAllCombinations( newInput )

  result = empty list

  for each possible value for the first element of the result as newElement 
  (can be enumerated by using first) {
    combine newElement with subResult and put in result
  }

  return result
}

因此,背后的想法是,从输入中取出第一个元素,递归地为较小的输入生成所有解。然后将解决方案与第一个元素产生的所有可能元素结合起来。

基本情况是,当输入数组只有一个元素时。这里的答案是该单元格的所有可能值的列表。