2017-06-10 18 views
0

別のJSONオブジェクトによってlodashを使用してオブジェクトの配列をフィルタリングしようとしています。私はobject.Iこのコードを試みたが、それはして返しORたいよりlodash:別のJSONオブジェクトによるオブジェクトの配列のフィルタリング

var searchParams = { 'user': 'ba', 'name': "don"} 

まず、配列オブジェクトのユーザーが含まれている場合は、2番目のオブジェクトのユーザーと第一のオブジェクト名は、第二のオブジェクト名が含まれています

var users = [ 
    { 'user': 'barney', 'name': "donald", 'active': true }, 
    { 'user': 'joe', 'name': "john", 'active': false }, 
    { 'user': 'fred', 'name': "peri", 'active': false }, 
    { 'user': 'fred', 'name': "aru", 'active': false }, 
    { 'user': 'fred', 'name': "teena", 'active': false }, 
    { 'user': 'fred', 'name': "nill", 'active': false }, 
    { 'user': 'fred', 'name': "duck", 'active': false }, 
    { 'user': 'barney', 'name': "resaj", 'active': false }, 
    { 'user': 'pebbles', 'name': "jee", 'active': true } 
]; 

別のJSONオブジェクトAND条件ではない条件。私は最初のオブジェクト{ 'user': 'barney', 'name': "donald", 'active': true } をしたい

_.filter(users, function(o) { 
        var checkFlag = false; 
        _.forOwn(searchParams, function(v,k) { 
         if(_.includes(o[k],v)){ 
          checkFlag = true; 
          return false; 
         } 
        }); 
        return checkFlag; 
       }); 

これは、以下を返し

[{ 'user': 'barney', 'name': "donald", 'active': true },{ 'user': 'barney', 'name': "resaj", 'active': false }] 

結果すべてのヘルプはappreciated.Anyアイデアだろう

答えて

2

あなたの問題があることは、あなたの_.forOwnためiteratee機能であり、もしユーザまたは名前フィールドのうちの1つだけが一致を生成する場合、ユーザオブジェクト全体が一致と見なされます。

期待どおりの結果を得るには、map reduceを実装できます。 (このスニペットは、lodashを使用しています)、次を使用してコードを置き換えます。この場合

_.filter(users, function(o) { 
    return _.map(searchParams, function(v,k) { 
     return _.includes(o[k],v) 
    }).reduce(function(isMatch, keyValueMatch){ 
     return isMatch && keyValueMatch 
    }, true); 
}); 

_.mapは、各ユーザーをチェックして、searchParams内のキーと値のペアがAであるかどうかを知らせる配列またはブール値を提供します一致。 reduce部分はブール値の配列を単一のtrueまたはfalseに集約します。 trueにするには、searchParamsのすべてのキーと値のペアがtrueの値を生成する必要があります。それ以外の場合、reduce部分はそのユーザーに対してfalseを返します。つまり、フィルタリングされます。

+0

おかげで、魔法のように動作し、以上の2つの検索のparamsを試してみましたあまりにも。 :) – Mahen

2

使用_.every()任意のチェックが失敗した場合、アイテムが除外されるように、searchParamsを反復処理する:ソロ@julian

var users = [ 
 
    { 'user': 'barney', 'name': "donald", 'active': true }, 
 
    { 'user': 'joe', 'name': "john", 'active': false }, 
 
    { 'user': 'fred', 'name': "peri", 'active': false }, 
 
    { 'user': 'fred', 'name': "aru", 'active': false }, 
 
    { 'user': 'fred', 'name': "teena", 'active': false }, 
 
    { 'user': 'fred', 'name': "nill", 'active': false }, 
 
    { 'user': 'fred', 'name': "duck", 'active': false }, 
 
    { 'user': 'barney', 'name': "resaj", 'active': false }, 
 
    { 'user': 'pebbles', 'name': "jee", 'active': true } 
 
]; 
 

 
var searchParams = { 'user': 'ba', 'name': "don"}; 
 

 
var result = _.filter(users, function(o) { 
 
    return _.every(searchParams, function(v, k) { 
 
    return _.includes(o[k], v); 
 
    }); 
 
}); 
 

 
console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>

関連する問題