javascript - 根据对象数组中的属性仅获取公共元素
问题描述
我进行了 API 调用,并在 Json 中检索了一些数据。JSON看起来像这样。这是输入:
[
{
"CategoryID": "1"
"CategoryName": "cat1"
"Indexes": [
{ "IndexID" : "1", IndexName: "name1"},
{ "IndexID" : "2", IndexName: "name2"},
{ "IndexID" : "3", IndexName: "name3"},
]
},
{
"CategoryID": "2"
"CategoryName": "cat1"
"Indexes": [
{ "IndexID" : "4", IndexName: "name4"},
{ "IndexID" : "5", IndexName: "name2"},
{ "IndexID" : "6", IndexName: "name3"},
]
},
{
"CategoryID": "1"
"CategoryName": "cat1"
"Indexes": [
{ "IndexID" : "7", IndexName: "name7"},
{ "IndexID" : "8", IndexName: "name2"},
{ "IndexID" : "8", IndexName: "name3"},
]
}
]
我有这个输出:
[
{ "IndexID" : "1", IndexName: "name1"},
{ "IndexID" : "2", IndexName: "name2"},
{ "IndexID" : "3", IndexName: "name3"},
{ "IndexID" : "4", IndexName: "name4"},
{ "IndexID" : "5", IndexName: "name2"},
{ "IndexID" : "6", IndexName: "name3"},
{ "IndexID" : "7", IndexName: "name7"},
{ "IndexID" : "8", IndexName: "name2"},
{ "IndexID" : "8", IndexName: "name3"},
]
我应该 :
[
{ "IndexID" : "2", IndexName: "name2"},
{ "IndexID" : "3", IndexName: "name3"}
]
indexName name2 和 name3 存在于所有选择的 3 个类别中。
CategoryModel 和 IndexModel 是我用来将我的 json 映射到对象的接口。这是 IndexModel 的示例:
export interface IndexModel {
IndexID: number;
IndexName: string;
...
Required: string;
DataType: string;
}
我以一种旨在构建列表的方法检索数据:
buildIndexList(): void {
console.log('# buildIndexList() called');
// console.log(JSON.stringify(this.selectedCategories));
const indexesClone = [...this.indexes];
for (const category of this.selectedCategories) {
console.log('Category : ', category);
for (const index of category.Indexes) {
this.indexes.push(index);
}
}
// this.filteredIndexes = [ ...new Map(this.indexes.map(item => [item['IndexName'], item])).values() ];
this.filteredIndexes = this.getCommonsElements(this.indexes, indexesClone);
console.log('Filtered values : ', this.filteredIndexes);
}
getCommonsElements(arr1: IndexModel[], arr2: IndexModel[]): IndexModel[] {
const res: IndexModel[] = [];
if (arr2.length === 0) {
arr1.forEach(el1 => {
res.push(el1);
});
} else {
arr1.forEach(el1 => {
arr2.forEach(el2 => {
if (el1.IndexName === el2.IndexName) {
res.push(el1);
}
});
});
}
return res;
}
如果我必须过滤相同的对象,代码就不会那么复杂。我的问题是对象根据它们的 IndexName 是相同的(没有意义,但这是我的用例)。
例如,如果我选择类别 1 和 2,我应该检索名称:name2 和 name3。我不能有重复,我必须得到索引的交集。
解决方案
推荐阅读
- c# - 如何解决 Windows.Devices.Geolocation.Geocoordinate 中的准确性问题?
- java - 我们如何按值降序对 Map 进行排序,然后按键按字母顺序排序?
- vue.js - 为什么尝试运行 Vue.js 它不能正常工作?
- python - 如何使用 dask 数据框进行降维?
- django - Pycharm 将新的 Django 测试文件识别为 unittest,而不是 django 测试
- python-3.x - 我在 tkinter 上的数量条目上未连接检查按钮
- spring - 自定义数据源 Spring boot
- zsh - 使用通配符扩展来回显 zsh 中的所有变量
- algorithm - 这个密文和明文有什么关系?
- windows-10 - 无法在 Windows 10 上运行 codedeployagent