UnderscoreJS - 将多个数组合并为一个

时间:2018-01-23 06:24:13

标签: javascript arrays underscore.js

我有四个数组,如下所示:

var array1 = [['dept', 'dept1'], ['empl', 'empl1'], ['month', 'Jan']];
var array2 = [['dept', 'dept2'], ['empl', 'empl2'], ['month', 'Feb']];
var array3 = [['dept', 'dept3'], ['empl', 'empl3'], ['month', 'March']];
var array4 = [['dept', 'dept4'], ['empl', 'empl4'], ['month', 'April']];

使用Underscore.js,我想合并它们以将结果数组重现为:

var resultArray = [
  ['dept', 'dept1', 'dept2', 'dept3', 'dept4'], 
  ['empl', 'empl1', 'empl2', 'empl3', 'empl4'], 
  ['month', 'Jan', 'Feb', 'March', 'April']
];

因此,每个嵌套数组的第一个元素是

我尝试使用_.zip,但它会重现单独的数组。

以下是JSFiddle

修改

其中一个数组中可能缺少某些元素。例如:

var array1 = [['dept', 'dept1'], ['empl', 'empl1'], ['month', 'Jan']];
var array2 = [['empl', 'empl2'], ['month', 'Feb']];
var array3 = [['dept', 'dept3'], ['month', 'March']];
var array4 = [['dept', 'dept4'], ['empl', 'empl4']];

3 个答案:

答案 0 :(得分:1)

 const result = [], position = {};

 for(const array of [array1, array2, array3, array4]){
   for(const [key, value] of array){
      if(key in position){
        result[ position[key] ].push(value);
      } else {
        position[key] = result.push([key, value]) - 1;
      }
   }
 }

这使用哈希表来存储键位置。当密钥没有被使用时,它会将一个新数组推送到结果,包括键和值,如果数组已经存在,它只是将值推送到该位置下的数组。请注意,这是O(n) n是键值对的数量。

如果你想要一个稀疏数组:

 const result = [], position = {};

 for(const [index, array] of [array1, array2, array3, array4].entries()){
   for(const [key, value] of array){
      if(!(key in position))
        position[key] = result.push([key]) - 1;
      result[ position[key] ][index + 1] = value;            
   }
 }

答案 1 :(得分:1)

您可以将数组合并为一个数组,然后使用array#forEachvar array1 = [['dept', 'dept1'], ['empl', 'empl1'], ['month', 'Jan']]; var array2 = [['empl', 'empl2'], ['month', 'Feb']]; var array3 = [['dept', 'dept3'], ['month', 'March']]; var array4 = [['dept', 'dept4'], ['empl', 'empl4']]; var combined = [] combined.push(array1, array2, array3, array4); var result = Object.values(combined.reduce((r,a) => { a.forEach(([name, value]) => { r[name] = r[name] || [name]; r[name].push(value); }); return r; }, {})) console.log(result);,您可以使用每个数组的第一个值合并它们。

getBannerStyle

答案 2 :(得分:0)

你真的需要Underscore JS吗?

// INPUT

var array1 = [['dept', 'dept1'], ['empl', 'empl1'], ['month', 'Jan']];
var array2 = [['dept', 'dept2'], ['empl', 'empl2'], ['month', 'Feb']];
var array3 = [['dept', 'dept3'], ['empl', 'empl3'], ['month', 'March']];
var array4 = [['dept', 'dept4'], ['empl', 'empl4'], ['month', 'April']];

//直接方式

var resultArray = [
Array.from(new set([...array1[0],...array2[0],...array3[0],...array4[0]])),
Array.from(new Set([...array1[1],...array2[1],...array3[1],...array4[1]])),
Array.from(new Set([...array1[2],...array2[2],...array3[2],...array4[2]]))];

//循环

var resultArray = [];
for(let i = 0; i <3; i++){
    resultArray.push(Array.from(new Set([...array1[i],...array2[i],...array3[i],...array4[i]])));
}

//结果

[
  ['dept', 'dept1', 'dept2', 'dept3', 'dept4'], 
  ['empl', 'empl1', 'empl2', 'empl3', 'empl4'], 
  ['month', 'Jan', 'Feb', 'March', 'April']
]