如何连接具有不同结构的两个阵列

时间:2019-01-28 17:59:34

标签: arrays angular typescript multidimensional-array

使用打字稿,我有两个数组(不同的结构),我希望从array1中获取所有不存在于array 2中的应用程序(array 2还有一层应用程序),这些连接基于app_id

数组1

[
  {
    "app_id": 2,
    "app_type_id": 1,
    "app_name": "Test 5",

  },
  {
    "app_id": 26,
    "app_type_id": 3,
    "app_name": "Test 4",
  },
  {
    "app_id": 177,
    "app_type_id": 2,
    "app_name": "Test 1",
  },
  {
    "app_id": 209,
    "app_type_id": 1,
    "app_name": "Test 2",
  }
]

数组2

[
  {
    "app_type_id": 2,
    "apps": [
      {
        "app_id": 177,
        "app_type_id": 2,
        "app_name": "Test 1",
      }
    ]
  },
  {
    "app_type_id": 1,
    "apps": [
      {
        "app_id": 209,
        "app_type_id": 1,
        "app_name": "Test 2",
      },
      {
        "app_id": 191,
        "app_type_id": 1,
        "app_name": "Test 3",
      }
    ]
  }
]

预期的输出数组3

[
  {
    "app_id": 2,
    "app_type_id": 1,
    "app_name": "Test 5",

  },
  {
    "app_id": 26,
    "app_type_id": 3,
    "app_name": "Test 4",
  }
]

TS文件 尝试了这个,但它无法正常工作,它正在返回所有记录

this.array3= this.array1.filter(o1 => this.array2.filter(o2 => o2.apps.filter(u => u.app_id === o1.app_id).length===0)); 

2 个答案:

答案 0 :(得分:2)

您可以尝试

array1.filter(e1 =>
  !array2.some(e2 => e2.apps.some(v => v[`app_id`] === e1[`app_id`]))
)

在这种情况下,您可能还想处理null / undefined。

答案 1 :(得分:1)

您可以使用此代码,我将其分解为多个句子以更清楚地说明发生了什么事情

const appIds = this.array2.map(i => (i.apps || []).map(item => item.app_id))
const allAppIds : any = appIds.reduce((a, b) => { return a.concat(b); },[]);

const notExistsItems = this.array1.filter(item => !allAppIds.includes(item.app_id));

查看此工作结果https://stackblitz.com/edit/angular-stackoverflow-54407756