angular - Typescript 使用 filter() 过滤数组

标签 angular typescript

我有下面的约定列表,我想按专业过滤此列表,即当我输入 15 时,它返回 id 1 和 2 的约定

[
 {
   "id": 1,
   "typeActivities": [
      {
        "id"=11,
        "specialitiesId": [10, 15]
      }
   ]
 },
 {
   "id": 2,
   "typeActivities": [
      {
        "id"=22,
        "specialitiesId": [10]
      },
      {
        "id"=222,
        "specialitiesId": [15]
      }
   ]
 },
 {
   "id": 3,
   "typeActivities": [
      {
        "id"=33,
        "specialitiesId": [12]
      }
   ]
 }
]

我尝试过这个函数,但没有返回任何内容

let input: number = 15;
let convention: Convention[];
convention = this.conventions.filter(convention => {
    let typeActivities: TypeActivity[] = convention.typeActivities.filter(typeActivitiy => {
        if (typeActivitiy.specialitiesId) {
            return input == typeActivitiy.specialitiesId.find(id => id == input);
        }
    });
    //console.log(convention.typeActivities.map(i => i.id).filter(item => typeActivities.map(i => i.id).indexOf(item) >= 0));
});

最佳答案

Array#some对于这样的事情确实很有用:

let input: number = 15;
let convention: Convention[];
convention = this.conventions.filter(convention =>
    convention.typeActivities.some(activity =>
        activity.specialitiesId.some(e => e == input)
    )
);

convention.typeActivities.some(...) 将对每个条目调用其谓词,直到它用完(some 返回 false)或者谓词返回真值(some 返回 true);与 activity.specialitiesId.some(...) 相同。

实时 JavaScript 示例:

const example = {
    conventions: [
      {
          "id": 1,
          "typeActivities": [
              {
                 "id": 11,
                 "specialitiesId": [10, 15]
              }
          ]
      },
      {
          "id": 2,
          "typeActivities": [
              {
                  "id": 22,
                  "specialitiesId": [10]
              },
              {
                  "id": 222,
                  "specialitiesId": [15]
              }
          ]
      },
      {
          "id": 3,
          "typeActivities": [
               {
                   "id": 33,
                   "specialitiesId": [12]
               }
          ]
      }
    ],
    find(input) {
      let convention;
      convention = this.conventions.filter(convention =>
        convention.typeActivities.some(activity =>
          activity.specialitiesId.some(e => e == input)
        )
      );
      return convention;
    }
};
console.log(example.find(15));
.as-console-wrapper {
  max-height: 100% !important;
}

关于angular - Typescript 使用 filter() 过滤数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53448333/

相关文章:

angular - 子路由中的参数

angular - 在 Angular 6 中获取并使用 Microsoft Graph token 从 Azure 获取组成员身份

json - 无法使用 Angular 6 和 ASP.NET MVC5 加载本地数据

typescript - 如何强制方法参数值成为接口(interface)的元素

arrays - 通过 json2typescript 反序列化 json 时出错

javascript - 为什么 useState 不在单元测试(Jest、Enzyme)中重新渲染组件?

javascript - 具有 Angular 2 的传单性能

未读取 Angular 6 scss 背景图像

组件模板中的 Angular 2 typescript 保护成员

reactjs - 使用子接口(interface)作为具有通用接口(interface)的 prop 接口(interface)