首页 > 解决方案 > 如何通过应用where子句从基于特定类别的array2中获取array1中不可用的记录

问题描述

我有两个array object数据。array1在哪里有 112 条记录,orgName ="ABC"array2是 102 条记录orgName ="ABC"。我想从中获取额外的 10 条记录,这些记录arrayNewarray1array2 中不存在。

我试过这个,但它给了我总记录,不管orgName我如何申请wherefilter申请orgName

let arrayNew = array1.filter( ( el ) => !array2.includes( el ) );

我怎样才能做到这一点?另外,谁能告诉我这叫intersection什么?

这就是我的数据的样子

    array1=
    {
        "orgId": 101,
        "orgGN": "ABC",
        "dId": 494,
        "name": "Test1",
    },
        {
        "orgId": 102,
        "orgGN": "ABC",
        "dId": 442,
        "name": "Test2",
    },
        {
        "orgId": 103,
        "orgGN": "ASR",
        "dId": 494,
        "name": "Test3",
    },

array2=
{
    "orgId": 101,
    "orgGN": "ABC",
    "dId": 494,
    "name": "Test1",
},
{
    "orgId": 105,
    "orgGN": "PDC",
    "dId": 420,
    "name": "Test5",
},
{
    "orgId": 106,
    "orgGN": "ASR",
    "dId": 44,
    "name": "Test6",
},

预期的操作

    {
    "orgId": 102,
    "orgGN": "ABC",
    "dId": 442,
    "name": "Test2",
},

标签: javascriptarraystypescript

解决方案


看起来我们在这里有复合键,例如orgIdand orgGN。因此,在过滤项目时,可以使用Map集合来获得O(n)复合键的时间复杂度:

let array1 = [
{
    "orgId": 101,         "orgGN": "ABC",        "dId": 494,
    "name": "Test1",
},
{
    "orgId": 102,        "orgGN": "ABC",        "dId": 442, /* +++*/
    "name": "Test2",
},
{
    "orgId": 103,        "orgGN": "ASR",        "dId": 494,
    "name": "Test3",
}];

let array2 =
[{
    "orgId": 101,        "orgGN": "ABC",        "dId": 494,
    "name": "Test1",
},
{
    "orgId": 105,        "orgGN": "PDC",        "dId": 420,
    "name": "Test5",
},
{
    "orgId": 106,        "orgGN": "ASR",        "dId": 44,
    "name": "Test6",
}];

const uniqueItems = new Map(array2.map(s => [`${s.orgId}-${s.orgGN}` , s]));
const result = array1.filter(f=> !uniqueItems.get(`${f.orgId}-${f.orgGN}`) && f.orgGN == 'ABC');
console.log(result);


推荐阅读