给定此输入[3,1,2],我想要此输出[ [ 1, 1 ], [ 1, 2 ], [ 1, 3 ], [ 2, 2 ], [ 2, 3 ], [ 3, 3 ] ]
其唯一对([1,2] == [2,1])

目前我已经做到了

const arr = [3,1,2];
const pairBuilder = (left, index, collection) =>
  collection.slice(index).map(right => [left, right]);

const pairs = arr.sort().flatMap(pairBuilder);
console.log(pairs)

这段代码是有功能的,但是我想知道是否有更好的方法(就性能而言)?我虽然已经使用lodash来改善排序/映射(使用chain),但是我的问题更多是关于算法改进。

最佳答案

您可以将 Generator function* 一起使用,并对数组进行 slice 以仅获取唯一对。

function* getPairs(array, left) {
    var i = 0;
    while (i < array.length) {
        if (left) yield [left, array[i]];
        else yield* getPairs(array.slice(i), array[i]);
        i++;
    }
}

var array = [1, 2, 3];

console.log([...getPairs(array)]);
.as-console-wrapper { max-height: 100% !important; top: 0; }


经典方法。

function getPairs(array) {
    var i, j, result = [];
    for (i = 0; i < array.length; i++) {
        for (j = i; j < array.length; j++) {
            result.push([array[i], array[j]]);
        }
    }
    return result;
}

var array = [1, 2, 3];

console.log(getPairs(array));
.as-console-wrapper { max-height: 100% !important; top: 0; }

07-25 22:44