用JavaScript解决这个看似简单的数组循环难题

Solve this seemingly simple array loop puzzle in JavaScript

本文关键字:简单 数组 循环 难题 JavaScript 解决      更新时间:2023-09-26

由于某种原因,我很难处理这个问题。我喜欢拼图,但我在这个方面做得不太好。

以下数组内部可以有大量集合,但永远不会比您在本例中看到的更深(即,永远不会比二维更深):

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(', ');
}