2016-10-10 6 views
0

I以下のデータを持っている: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を返します。これは初めてのロダッシュです。私は間違って何をしていますか?第2に、このようにして、別のユーザーの選択、たとえばジョブの種類別にフィルタリングを続けることができますか?

+0

は 'development'、' testing'や文字列ことになって 'design'ませんか? –

+0

あなたはそうです。更新しました。 – BJacks

答えて

0

最終結果として取得しようとしているメイン配列に_.filterを使用し、_.mainおよび_.intersectionと共に_.chainを使用してオブジェクトの内部配列をフィルタリングできます。

それはかなりではありませんが、コードのようなもので十分です。

var self = this; 

_.filter(jobs, function(job) { 

    return _.chain(job.industry) 
    .map('name') 
    .intersection(self.jobchoices) 
    .size() 
    .gt(0) 
    .value() 
}) 

(のみ最新lodashでテスト - v4.16.4)

0

あなたの例のデータでは、両方のジョブがindustry項目に一致しているjobsので、すべてのジョブに対してtrueを返す必要があります。

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))); 
あなただけの jobsのいずれかと一致する項目(または複数のアイテムを)持っているあなたの jobchoices配列を変更した場合、それはこの(バニラJS)のようになります

どこが間違っているかについては、最上位の_.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; 
}); 
+0

ありがとうございます。私は、仕事の配列がサンプルであることを明確にすべきであり、異なる産業の仕事のための他のエントリがあります。 – BJacks

関連する問題