我正在尝试使用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]);
})