如何通过应用 where 子句从 array1 中获取基于特定类别的 array2 中不可用的记录



我有两个数据array objectarray1有 112 条记录,其中orgName ="ABC"array2有 102 条记录再次orgName ="ABC"。我想从 array2 中不存在的array1中获取额外的 10 条arrayNew记录。

我试过这个,但它给了我总记录,无论orgName如何,我如何为orgName申请wherefilter

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",
},

看起来我们这里有组合键,例如orgIdorgGN.因此,在筛选项目时,可以使用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);

您可以创建一个array2orgId数组,并按orgName字段和所需值过滤array1,如下所示:

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",
}
];
const 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",
}
];
function intersection(array1, array2, field, value) {
const array2OrgIds = array2.map(item => item.orgId);
return  array1.filter((el) => !array2OrgNames.includes(el.orgId) && el[field] === value);
}
console.log(intersection(array1, array2, "orgGN", "ABC"));

不确定数据的结构,但这将返回一个新数组,其中包含不在 array2 中但在 array1 中的对象,其 orgName 为 ABC:

const array1 = [
{
orgId: 101,
orgGN: "ABC",
dId: 494,
name: "Test1",
},
{
orgId: 102,
orgGN: "ABC",
dId: 442,
name: "Test2",
},
{
orgId: 110,
orgGN: "ABC",
dId: 596,
name: "Test10",
},
{
orgId: 103,
orgGN: "ASR",
dId: 494,
name: "Test3",
},
];
const 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 objArrayDiff = (array1, array2, fieldName, fieldValue) => {
return array1
.filter((item) => item[fieldName] === fieldValue)
.filter(
(item) =>
!array2
.filter((item) => item[fieldName] === fieldValue)
.some((array2Item) => array2Item.orgId === item.orgId)
);
};
console.log(objArrayDiff(array1, array2, "orgGN", "ABC"));

最新更新