首页 > 解决方案 > 根据对象数组中的属性仅获取公共元素

问题描述

我进行了 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。我不能有重复,我必须得到索引的交集。

标签: javascripttypescript

解决方案


推荐阅读