我需要根据子元素的键进行Lodash过滤器



我正在尝试使用lodash在React应用中过滤对象。

const filteredContacts = _(contacts)
        .map((contact, id) => ({_id: id, ...contact}))
        .filter(contact => !(this.state.filter && contact.lastName.toLowerCase().indexOf(this.state.filter) == -1 && contact.firstName.toLowerCase().indexOf(this.state.filter) == -1))
        .filter(c => {
            _(c.courses)
                .map((course, id) => ({_id: id, ...course}))
                .each(course => {
                    console.log(course._id)
                    return (course._id == this.state.courseId)
                })
        })

这是从firebase数据库中提取的,因此有一些节点只是一个钥匙,没有值,然后有孩子。在这种情况下,我已经大写了下面的地方。

联系人>用户>课程>课程> coursedata

contacts: {
  -uf39uhef2: {
    name: blah,
    courses: {
      -dfh92ehfdsfhw: {
        coursename: name
      }
    }
  }
}

我知道我的第二个过滤器是所有错误的 - 我刚刚粘贴了一百万尝试的最后一次迭代。this.state.courseid是我要过滤的课程ID - 我该如何完成?

我想返回所有具有与状态匹配的课程ID的用户。

在过滤器中检查联系人是否有课程,以及coureses[this.state.courseId]是否真实:

const filteredContacts = _(contacts)
        .map((contact, id) => ({_id: id, ...contact}))
        .filter(({ courses }) => _.has(courses, this.state.courseId));

const contacts = {
  '-uf39uhef2': {
    name: 'blah',
    courses: {
      '-dfh92ehfdsfhw': {
        coursename: 'name'
      }
    }
  },
  '-willBeFiltered': {
    name: 'willBeFiltered',
    courses: {
      '-willBeFiltered': {
        coursename: 'name'
      }
    }
  }
};
const courseId = '-dfh92ehfdsfhw'; // courseId = this.state.courseId
const filteredContacts = _(contacts)
        .map((contact, id) => ({_id: id, ...contact}))
        .filter(({ courses }) => _.has(courses, courseId));
console.log(filteredContacts);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.2/lodash.min.js"></script>

您也可以在没有lodash的情况下执行此操作:

const filteredContacts = Object.keys(contacts)
    .map((id) => ({_id: id, ...contacts[id]}))
    .filter(({ courses }) => courses && courses[this.state.courseId]);

只需使用_。pickby以获取所需的用户

_.pickBy(contacts, (user) => {
    return _.chain(user)
        .get('courses')
        .keys()
        .includes(courseId)
        .value();
});

另一种方式

_.pickBy(contacts, (user) => {
    return _.has(user, ['courses', courseId]);
})

最新更新