首页 > 解决方案 > 如何合并/组合两个数组并以角度创建一个新行

问题描述

data1 = [{
 row: 1,
 name: 'edward'
}];

data2 = [{
 row: 1,
 style: 'style 1'
},{
 row: 2,
 style: 'style 2'
},{
 row: 3,
 style: 'style 3'
}];

我要做的是合并/合并数据并创建一个新行。我尝试使用过滤器,但它不显示数据 row2 和 row3。导致从 data1 它只有 1 行。

这是预期的输出

[{
    row: 1, data1: { name: 'edward' }, data2: { style: 'style 1' }
},{
    row: 2, data1: { }, data2: { style: 'style 2' }
},{
    row: 3, data1: { }, data2: { style: 'style 3' }
}];

然后当有来自 data1 的新数据时,应该添加它。例子:

{ row: 5, name: 'juan' }

它应该是这样的:

[{
    row: 1, data1: { name: 'edward' }, data2: { style: 'style 1' }
},{
    row: 5, data1: { name: 'juan' }, data2: { }
},{
    row: 2, data1: { }, data2: { style: 'style 2' }
},{
    row: 3, data1: { }, data2: { style: 'style 3' }
}];

我试过的代码:

const data = this.data1.filter((x: any) => this.data2.map((y: any) => y.row === x.row));
console.log(data)

标签: javascripttypescript

解决方案


试试这个

data1 = [
{row: 1,name: 'edward'},
{ row: 5,name: 'juan' } 
];

data2 = [
{
 row: 1,
 style: 'style 1'
},{
 row: 2,
 style: 'style 2'
},{
 row: 3,
 style: 'style 3'
}];

function mergeData(data1,data2){
  hashDataOne = {};
  mergedArray = [];
  data1.forEach(ele =>{
    hashDataOne[ele.row] = ele.name;
  });
  
  data2.forEach(ele =>{
    if(ele.row in hashDataOne){
      mergedArray.push({
        row: ele.row,
        data2:{style:ele.style},
        data1:{name:hashDataOne[ele.row]}
      });
      delete hashDataOne[ele.row]; 
    } else {
      mergedArray.push({
        row: ele.row,
        data2:{style:ele.style},
        data1:{}
      });    
    }
  });
  
  for(const row in hashDataOne){
      mergedArray.push({
        row: row,
        data2:{},
        data1:{name: hashDataOne[row]}
      });    
  }
   
  return mergedArray;
}

console.log(mergeData(data1,data2));


推荐阅读