[英]How can I filter a nested object with an array of values using lodash?
我有以下数据:
var jobs = [
{
job_type: "Part Time",
latitude: 49.545068,
longitude: 0.760518,
title: "reiciendis",
industry: [
{
id: 1,
name: "development" },
{
id: 2,
name: "design"
}
]},
{
job_type: "Full Time",
latitude: 51.545068,
longitude: 0.460518,
title: "auteas",
industry: [
{
id: 1,
name: "development" },
{
id: 2,
name: "testing"
}
]
并且我想尝试根据用户搜索参数(即选择职位的行业选择)过滤结果,这些参数会填充一个数组:
var jobchoices = ["testing", "design"];
到目前为止,我的lodash过滤器如下所示:
var self = this
return _.filter(this.jobs, function(item) {
return _.filter(item.industry, function(obj) {
return _.some(self.jobchoices, obj.name);
});
});
但对于所有作业,它都返回true。 这是我第一次使用lodash。 我究竟做错了什么? 其次,我是否可以继续以这种方式链接以按另一个用户选择(例如,按工作类型)进行筛选?
您可以将_.filter用作要尝试获取的最终结果的主数组,然后将_.chain与_.map和_.intersection一起使用以过滤内部对象数组。
尽管不是很漂亮,但是类似下面的代码就足够了。
var self = this;
_.filter(jobs, function(job) {
return _.chain(job.industry)
.map('name')
.intersection(self.jobchoices)
.size()
.gt(0)
.value()
})
(仅在最新的lodash-v4.16.4中进行了测试)
对于所有作业,它应该返回true,因为示例数据jobs
两个jobs
都具有匹配的industry
项目。 如果将jobchoices
数组更改为一个(或多个)项仅与您的一项jobs
匹配,则可能看起来像这样(香草JS):
var matches = jobs.filter(function(job) {
return job.industry.some(function(industry) {
return jobchoices.indexOf(industry.name) > -1;
});
});
或等效于ES6:
let matches = jobs.filter(({industry} => industry.some(({name}) => jobchoices.includes(name)));
至于哪里出了问题,顶级_.filter
将返回另一个_.filter
(它将返回一个数组- 是真实的 -因此将返回所有项目)。 无论内部_.filter
调用的长度是否> 0
,您都应该能够修改原始代码以进行补救:
return _.filter(this.jobs, function(item) {
var matchingIndustries = _.filter(item.industry, function(obj) {
return _.some(self.jobchoices, obj.name);
});
return matchingIndustries.length > 0;
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.