使用打字稿,我有两个数组(不同的结构),我希望从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));
答案 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