我在js中有以下数组:
var list = [
['nice', 'delicious', 'red'],
['big', 'tiny'],
['apple']
];
我想获得所有可能的变体,例如:
['nice', 'big', 'apple']
['delicious', 'big', 'apple']
['red', 'big', 'apple']
['nice', 'tiny', 'apple']
...
实现这一目标的最佳/最有说服力的方法是什么?
答案 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之类的库的常见用例。
这是一个显示它正在运行的垃圾箱。