开发者问题收集

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

2017-07-20
91

我有一个零件编号数组, ['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']

有什么有效的方法可以做到这一点?

3个回答

使用 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);

ES6 版本使用 Array#concat 和 扩展语法 展平子数组,并使用 模板文字 来创建字符串。

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);
Ori Drori
2017-07-20

笛卡尔积 是这种组合类型的数学术语。

如果您不习惯使用“更花哨”的数组方法,一种简单的方法是使用嵌套的 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"]
Peter Olson
2017-07-20

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

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);
James
2017-07-20