出于某种原因,我很难用这个。我喜欢谜题,但我在这个方面表现不佳。
以下数组内部可以包含大量的数组,但不会比您在此示例中看到的更深(即,永远不会超过2维):
var list = [['a', 'b'], ['c'], ['d', 'e']];
以上输入为例,如何在JavaScript中生成以下数组?
[['a', 'c', 'd'], ['a', 'c', 'e'], ['b', 'c', 'd'], ['b', 'c', 'e']]
我确信解决方案涉及递归,但它不是一个简单的树结构,所以它并不像看起来那么简单。
答案 0 :(得分:3)
所以你在寻找排列笛卡尔积?
function product(list) {
// Keep a current index for each set
var indices = list.map(_ => 0); // More Firefox 22 promotion :)
indices[indices.length - 1] = -1;
var result = [];
while(true) {
// Get the next permutation
for(var i = indices.length - 1; i >= 0; i--) {
if(++indices[i] === list[i].length) {
indices[i] = 0;
} else {
break;
}
}
if(i === -1) {
// All done!
return result;
}
// Turn the array of indices into an array of values
result.push(indices.map((n, i) => list[i][n]));
}
}
答案 1 :(得分:1)
BTW,我正在使用它从嵌套结构生成CSS选择器,比如Sass。以下功能有效且非常简洁:
function cartesianProduct() {
var result = this.selectors.reduce(function(a, b) {
return a.map(function(x) {
return b.map(function(y) {
return [x, y].join(' ');
});
});
})[0];
return typeof result === 'string' ? result : result.join(', ');
}