plain javascript - 从两个数组中获取对的集合的函数

时间:2018-01-14 16:18:53

标签: javascript arrays function combinations

给出两个数组(大小未知),如下所示:

var first = ['A1','A2','A3'];
var second= ['B1','B2'];

我希望从这些数组中获取所有可能的对。在上面的示例中,正确的结果应如下所示:

var result = [['A1B1','A2B2'], ['A1B1','A3B2'],['A1B2','A2B1'],['A1B2','A3B1'],['A2B1','A3B2'],['A2B2','A3B1']];

我试图自己提出解决方案,但我陷入越来越大的嵌套循环数中......

编辑:

对不起,也许在形成我的问题时我并不是那么清楚。也许在一个例子上会更容易 - 让我们假设第一个数组包含卡车司机的名字,第二个数组包含城市。每个司机只能开车到一个城市,每个城市只能由单个司机访问。

在这种情况下,函数的预期输出将是可能组合的完整列表(驱动程序+城市)。未知长度的输入数组显然意味着可能存在无法在任何地方开车的驱动程序,并且可能有些城市不会被任何驱动程序访问。

我希望现在我的问题更清楚了。

EDIT2:

我不认为这是Finding all possible value combinations between two arrays的副本,因为该问题中的接受答案仅适用于(如果我理解正确)第二个长度为2的数组。

2 个答案:

答案 0 :(得分:1)

重写答案以处理任意长度的数组。

技巧here是,因为较短数组的每个元素将在每个配对中使用一次,您可以将它按顺序保留为每对的前半部分。然后置换它周围的第二个数组,丢弃任何剩余的元素,以获得所有可能的组合:

var permute = function(arr) {
  // returns an array containing every permutation of the input array
  var permutations = [];
  if (arr.length === 1) return [arr];
  for (var i = 0; i < arr.length; i++) {
    var subPerms = permute(arr.slice(0, i).concat(arr.slice(i + 1)));
    for (var j = 0; j < subPerms.length; j++) {
      subPerms[j].unshift(arr[i]);
      permutations.push(subPerms[j]);
    }
  }
  return permutations;
}

var pairs = function(in1, in2) {
  if (in1.length > in2.length) return pairs(in2, in1); // swap the arrays if the longer one was first

  var out = [];
  var permutations = permute(in2);

  for (var i = 0; i < permutations.length; i++) {
    var subarr = permutations[i];

    subarr.length = in1.length; // drop extras
    for (var j = 0; j < in1.length; j++) {
      subarr[j] = in1[j] + subarr[j] // match up the shorter array to this arrangement
    }
    out.push(subarr);
  }
  return out;
}

var first = ['A1', 'A2', 'A3'];
var second = ['B1', 'B2','B3'];
console.log(pairs(first, second))
.as-console-wrapper {
  max-height: 100% !important
}

答案 1 :(得分:-1)

你必须使用两个循环,你不能逃避它,并且函数是这样的:

var combinationOf = function(one, two) { 
 var res = [];
 first.forEach((a) => {
   second.forEach((b) => {
     res.push(a + b);
   });
 });
 return res;
}