基于JavaScript中过滤器数组的过滤器数组

罗伯·格里森

我有一个用户数组和一个过滤器数组。

我需要根据过滤器数组过滤用户,但是当我这样做时,它将过滤一个数组,而不过滤其他数组

我的过滤器对象如下所示:

filters: {
  levels: [],
  locations: ['Laois'],
  subjects: ['Art']
}

我的用户如下所示:

const users = [
  {
    email: '[email protected]',
    levels: ['Ordinary'],
    location: 'Laois',
    subjects: ['Art', 'German']
  },
  {
    email: '[email protected]',
    levels: ['Higher', 'Ordinary'],
    location: 'Laois',
    subjects: ['English', 'German']
  }
]

根据上面的过滤器,过滤后的用户只能是一个,因为其中包含“ Art”和“ Laois”:

[{
    email: '[email protected]',
    levels: ['Ordinary'],
    location: 'Laois',
    subjects: ['Art', 'German']
  },
]

但是我仍然得到两个用户:

编辑我的代码:

applyFilter = (visable) => {
    let { filters, users } = this.state;
    const { subjects, locations, levels } = filters;


    let filteredUsers = [];
    const filteredData = users.filter((user) =>
      user.subjects.some(subject => subjects.includes(subject)) ||
      locations.some(location => location === user.location) ||
      user.levels.some(level => levels.includes(level))
    );

    console.log(filteredData)


    if (!subjects.length && !locations.length && !levels.length) {
      filteredUsers = users;
    } else {
      filteredUsers = filteredData;
    }

    this.setState({
      filterModalVisible: visable,
      filteredResults: filteredUsers.length >= 0 ? filteredUsers : [],
    });
  }
内纳德·弗拉卡(Nenad Vracar)

您可以使用filterevery方法通过使用相同的键检查用户值中是否存在过滤器值中的每个元素来实现此目的。

const filters = {"levels":[],"locations":["Laois"],"subjects":["Art"]}
const users = [{"email":"[email protected]","levels":["Ordinary"],"locations":"Laois","subjects":["Art","German"]},{"email":"[email protected]","levels":["Higher","Ordinary"],"locations":"Laois","subjects":["English","German"]}]

const res = users.filter(user => {
  return Object.entries(filters)
    .every(([key, value]) => {
      if (Array.isArray(value)) {
        return value.every(filter => {
          return user[key] && user[key].includes(filter)
        })
      } else {
        return user[key] == value
      }
    })
})

console.log(res)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章