如何采用两个字符串数组来构建一个将它们组合在一起的数组?

时间:2017-07-20 21:16:39

标签: javascript arrays

我有一个零件编号数组,['PCI-33', 'GG-34', 'GG-32']

我有一系列区域,['UK', 'US', 'CA', 'MX']等。

我正在尝试将这两个数组合并,以便我可以得到这样的结果:

['PCI-33-UK', 'GG-34-UK', 'GG-32-UK', 'PCI-33-US', 'GG-34-US', ..., 'GG-32-MX']

这样做的有效方法是什么?

4 个答案:

答案 0 :(得分:6)

使用2个嵌套Array#map创建两个数组的合并,并应用Array#concat来展平结果:

var strs1 = ['PCI-33', 'GG-34', 'GG-32'];
var strs2 = ['UK', 'US', 'CA', 'MX'];

var result = [].concat.apply([], strs1.map(function(str1) {
  return strs2.map(function(str2) {
    return str1 + '-' + str2;
  });
}));

console.log(result);

使用Array#concat和spread syntax的ES6版本展平子数组,使用template literal创建字符串。

var strs1 = ['PCI-33', 'GG-34', 'GG-32'];
var strs2 = ['UK', 'US', 'CA', 'MX'];

var result = [].concat(...strs1.map((str1) => strs2.map((str2) => `${str1}-${str2}`)));

console.log(result);

答案 1 :(得分:4)

Cartesian product是此类组合的数学术语。

如果您不习惯使用"发烧友"数组方法,一种简单的方法是使用嵌套的for循环:

var parts = ['PCI-33', 'GG-34', 'GG-32'],
    zones = ['UK', 'US', 'CA', 'MX'];

var combined = [];
for(var i = 0; i < parts.length; i++) {
    for(var j = 0; j < zones.length; j++) {
        combined.push(parts[i] + "-" + zones[j]);
    }
}

然后combined将包含

["PCI-33-UK", "PCI-33-US", "PCI-33-CA", "PCI-33-MX", "GG-34-UK", "GG-34-US", "GG-34-CA", "GG-34-MX", "GG-32-UK", "GG-32-US", "GG-32-CA", "GG-32-MX"]

答案 2 :(得分:3)

带有1个循环的ES-1999代码:

&#13;
&#13;
var codes = ['PCI-33', 'GG-34', 'GG-32'];
var zones = ['UK', 'US', 'CA', 'MX'];
var arr = [];

var cl = codes.length;

for (var i=0; i < cl * zones.length; i++) {
  arr.push(codes[i % cl] + "-" + zones[Math.floor(i / cl)]);
}

console.log(arr);
&#13;
&#13;
&#13;

答案 3 :(得分:0)

你也可以这样做;

function combine(a,[b,...bs]){
  return [a + "-" + b].concat(bs.length ? combine(a,bs) : []);
}

var arr = ['PCI-33', 'GG-34', 'GG-32'],
    brr = ['UK', 'US', 'CA', 'MX'],
    res = function runner([a,...as],bs){
            return combine(a,bs).concat(as.length ? runner(as,bs) : []);
          }(arr,brr); // Recursive IIFE here

console.log(res);