用JavaScript解决这个看似简单的数组循环难题
Solve this seemingly simple array loop puzzle in JavaScript
由于某种原因,我很难处理这个问题。我喜欢拼图,但我在这个方面做得不太好。
以下数组内部可以有大量集合,但永远不会比您在本例中看到的更深(即,永远不会比二维更深):
var list = [['a', 'b'], ['c'], ['d', 'e']];
有了以上内容作为输入,我如何在JavaScript中生成以下数组?
[['a', 'c', 'd'], ['a', 'c', 'e'], ['b', 'c', 'd'], ['b', 'c', 'e']]
我确信这个解决方案涉及递归,但它不是一个简单的树结构,所以它并不像看起来那么简单。
所以您正在寻找
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]));
}
}
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(', ');
}
相关文章:
- 简单JQuery数组
- 将简单数组转换为对象数组
- 简单数组&Javascript中的循环
- 简单数组递归而不是while
- 将数组转换为简单的数组格式
- 在MongoDB中,从文档中获取单个字段数组的最简单方法是什么
- 检查数组中元素的数据类型是否为日期对象的最简单方法
- 简单的事情,如何将变量存储到数组中
- 如何在 javascript 中将关联数组转换为值的简单字符串数组
- D3.js键功能在简单的选择器/数组组合上运行两次
- 为简单数组提供带有 ng 选项的模型索引
- 简单的javascript:数组和表单信息收集
- 简单的javascript:数组和表单信息收集#2
- 有没有简单的方法可以随机洗牌 JavaScript 数组但固定到给定键
- 创建简单的动态数组
- 来自数据库数组的简单 Javascript 幻灯片
- 从对象数组创建简单数组&另一个简单的数组
- 返回简单数组时出现问题:;未捕获的ReferenceError:n未定义”;
- 这对于数组元素上的简单数组迭代操作来说是最有效的
- 用javascript制作一个带有2个简单数组的2d数组