数组排列功能

时间:2016-09-09 09:42:14

标签: javascript iteration permutation

我正在尝试使用排列功能,但这让我感到困惑。

示例数据集:

{
    a: [1,2],
    b: [1,2,3],
    c: [1,2]
}

所需的输出:

[
    [ 'a-1', 'b-1', 'c-1' ],
    [ 'a-1', 'b-1', 'c-2' ],
    [ 'a-1', 'b-2', 'c-1' ],
    [ 'a-1', 'b-2', 'c-2' ],
    [ 'a-1', 'b-3', 'c-1' ],
    [ 'a-1', 'b-3', 'c-2' ],
    [ 'a-2', 'b-1', 'c-1' ],
    [ 'a-2', 'b-1', 'c-2' ],
    [ 'a-2', 'b-2', 'c-1' ],
    [ 'a-2', 'b-2', 'c-2' ],
    [ 'a-2', 'b-3', 'c-1' ],
    [ 'a-2', 'b-3', 'c-2' ],
]

到目前为止,我已遍历Object,然后针对每个Array迭代key,然后需要再次执行此操作..

首先,我把这些值打破了:

[
    [ 'a-1', 'a-2' ],
    [ 'b-1', 'b-2', 'b-3' ],
    [ 'c-1', 'c-2' ]
]

然后迭代它们:

var list_joined = []
var list = []
array.forEach((key, index) => {
    key.forEach((value) => {
        var tmp = [value]
        array.forEach((_value, _index) => {
            if(_index != index) {
                tmp.push(_value[0])
            }
        })
        tmp = tmp.sort()
        if(list_joined.indexOf(tmp.join('_')) < 0) {
            list_joined.push(tmp.join('_'))
            list.push(tmp)
        }
    })
})

结果

[
    [ 'a-1', 'b-1', 'c-1' ],
    [ 'a-1', 'b-1', 'c-2' ],
    [ 'a-1', 'b-2', 'c-1' ],
    [ 'a-1', 'b-3', 'c-1' ],
    [ 'a-2', 'b-1', 'c-1' ]
]

我无法完全了解修复迭代过程的位置。

1 个答案:

答案 0 :(得分:2)

您可以使用迭代和递归方法。

&#13;
&#13;
function combine(object) {

    function c(part, index) {
        object[keys[index]].forEach(function (a) {
            var p = part.concat(keys[index] + '-' + a);
            if (p.length === keys.length) {
                r.push(p);
                return;
            }
            c(p, index + 1);
        });
    }

    var keys = Object.keys(object),
        r = [];

    c([], 0);
    return r;
}

var data = { a: [1, 2], b: [1, 2, 3], c: [1, 2] },
    result = combine(data);

console.log(result);
&#13;
.as-console-wrapper { max-height: 100% !important; top: 0; }
&#13;
&#13;
&#13;