通过多个值过滤具有嵌套数组的对象

时间:2021-05-06 23:07:22

标签: javascript

我正在尝试通过几个条件过滤带有嵌套数组的对象。过滤选项是动态生成的并存储在数组中。此选项值是嵌套对象中的主题 ID。如果过滤选项包含例如 2 个 id 的值,我需要显示具有该主题 id 的所有对象。

let data = {
  '17 may': [
    {
      id: 31,
      name: 'Test Name',
      theme: {
        id: 2,
        name: 'Theme Test Name',
      },
    },
  ],
  '18 may': [
    {
      id: 41,
      name: 'Test Name',
      theme: {
        id: 2,
        name: 'Theme Test Name',
      },
    },
    {
      id: 43,
      name: 'Test Name',
      theme: {
        id: 3,
        name: 'Theme Test Name',
      },
    },
  ],
  '19 may': [
    [
      {
        id: 51,
        name: 'Test Name',
        theme: {
          id: 1,
          name: 'Theme Test Name',
        },
      },
      {
        id: 52,
        name: 'Test Name',
        theme: {
          id: 2,
          name: 'Theme Test Name',
        },
      },
    ],
  ],
};

filteringOptions = [1,2]; // theme id's

我对嵌套对象使用过滤功能。它工作正常,但我不知道如何通过多个过滤选项。

filterArray(array, filters) {
    const filterKeys = Object.keys(filters);
    return array.filter((item) => {
      return filterKeys.every((key) => {
        if (typeof filters[key] !== 'function') return true;
        return filters[key](item[key]);
      });
    });
  }

过滤算法

const filteredByThemeId = {};

for (const day in data) {
  filteredByTheme[day] = [];
  this.data[day].map((item, index) => {
    filteredByThemeId[day][index] = [
      ...filterArray(item, {
        theme:
          (theme) => {
            if (!theme) return;
            return theme.id === 2; // works fine, but I need to pass all values from filtering options array (options can contain 2, 5, 10 etc. values)
          },
      }),
    ];
  });
}

1 个答案:

答案 0 :(得分:1)

假设您要过滤名为 filterList = [2,5,10] 的列表中的所有值。你可以试试 return theme.id === 2

而不是 return filterList.includes(theme.id)