我有一个零件编号数组,['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']
这样做的有效方法是什么?
答案 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代码:
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;
答案 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);