从javascript中的多维数组中获取所有变体

时间:2016-01-25 22:12:45

标签: javascript arrays multidimensional-array

我在js中有以下数组:

var list = [
  ['nice', 'delicious', 'red'],
  ['big', 'tiny'],
  ['apple']
];

我想获得所有可能的变体,例如:

['nice', 'big', 'apple']
['delicious', 'big', 'apple']
['red', 'big', 'apple']
['nice', 'tiny', 'apple']
...

实现这一目标的最佳/最有说服力的方法是什么?

2 个答案:

答案 0 :(得分:2)

我试图想出一些像递归或叠加地图一样真实的东西并减少,但这些问题似乎并不足以证明不同于以下内容:

var result = list[0].map(function(item) { return [item]; });

for (var k = 1; k < list.length; k++) {
    var next = [];
    result.forEach(function(item) {
        list[k].forEach(function(word) {
            var line = item.slice(0);
            line.push(word);
            next.push(line);
        })
    });
    result = next;
}

console.log(result);

答案 1 :(得分:-1)

编辑:这没有回答OP的问题,主题略有不同。这应该是正确的。

Finding All Combinations of JavaScript array values

我会从一个更普通的&#39;中解决这个问题。立场。你有一个数组,并希望从中获得一个随机值。只要你知道数组的长度,这很容易。我这样做的方法是,从&#39;长度&#39;生成一个随机索引。单个阵列的属性并将其拉出。

这是一个快速而肮脏的演示。

var sentence = '';
var fragments = [
  ['delicious', 'bad', 'gross'],
  ['red', 'green', 'blue'],
  ['apple', 'orange', 'basketball']
];

// This could be used over and over for any array,
// just pass it the length
function randomIndex(i) {
  return Math.floor(Math.random() * i);
}

// This is more specific to your use case, go into each
// each child array and just pick a random element
fragments.forEach(function(el) {
  possibleIndex = randomIndex(el.length);
  // Join the next piece
  sentence += el[randomIndex(possibleIndex)] + ' ';
});

// Do something with sentence here
console.log(sentence) //=> 'bad green apple'

当然,您可以清理它,并且每次都需要清除该句子变量。就像我说的那样,又快又脏。像这样的东西应该被抽象出来,并且是诸如下划线和lodash之类的库的常见用例。

这是一个显示它正在运行的垃圾箱。

https://jsbin.com/guxiziwoqa/edit?html,js,output