【发布时间】:2020-01-08 11:19:02
【问题描述】:
请注意:链接的问题“如何为两个数组的内容创建每个可能的组合?” 没有解决这个特定的问题。标记的人并不完全理解这个特定的排列和要求。
如果您有两个数组(arr1、arr2),每个数组中有 n 个元素(即每个数组的长度相同),那么问题是:获取/确定所有元素的最佳方法是什么?可能匹配的元素与 same 数组中的其他元素不匹配且顺序无关紧要?
例如,假设我有:
arr1 = ["A","B","C"];
arr2 = ["Z","Y","X"];
我想返回一个数组数组,其中一个数组的每个元素都与另一个数组的元素配对。所以结果将是一组独特的数组:
matches = [
[["A","Z"],["B","Y"],["C","X"]],
[["A","Z"],["B","X"],["C","Y"]],
[["A","Y"],["B","X"],["C","Z"]],
[["A","Y"],["B","Z"],["C","X"]],
[["A","X"],["B","Z"],["C","Y"]],
[["A","X"],["B","Y"],["C","Z"]],
]
请注意,这两个数组是相同的:
[["A","Z"],["B","Y"],["C","X"]]
[["B","Y"],["C","X"],["A","Z"]]
我正在尝试使用 vanilla JavaScript 来做到这一点,但我也完全愿意使用 Lodash。额外的好处是,因为这可能会失控,所以速度和性能很重要。但现在,我只是想得到一些能产生正确结果集的东西。为了限制这一点,此函数可能不会与两个以上的数组一起使用,每个数组包含 50 个元素。
这是我最近的尝试(使用 lodash):
function getMatches(arr1, arr2){
var matches = [];
for (var arr1i = 0, arr1l = arr1.length; arr1i < arr1l; arr1i++) {
for (var arr2i = 0, arr2l = arr2.length; arr2i < arr2l; arr2i++) {
matches.push(_(arr1).zip(arr2).value());
arr2.push(arr2.shift());
}
}
return matches;
}
【问题讨论】:
-
到目前为止你有什么尝试?
-
已将其添加到问题中。
-
它看起来不像是重复的......
-
这是怎么复制的?最初的问题在哪里被问到?链接的问题“如何为两个数组的内容创建每个可能的组合?”不能解决这个特定的问题。让我重新命名,因为我对配对组合本身不感兴趣,而是对组合集感兴趣。
标签: javascript arrays lodash combinations combinatorics