2017-06-10 157 views
0

我想通過另一個JSON對象使用lodash過濾一個對象數組。lodash:通過另一個JSON對象過濾對象數組

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對象:

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

如果第一個數組對象的用戶包含第二個對象的用戶和第一對象名稱包含比我想的object.I嘗試這個代碼第二個對象的名稱,但它返回OR條件不AND條件。

_.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 }] 

我只想要第一個對象{ 'user': 'barney', 'name': "donald", 'active': true } 任何幫助將是appreciated.Any想法

回答

2

你的問題是,在你的_.forOwn的iteratee功能,如果只是用戶或名稱字段中的一個產生匹配,則整個用戶對象被認爲是匹配的。

要產生您的預期結果,您可以實施地圖縮小。替換爲以下代碼(本段使用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一個鍵值對是否爲比賽。減少部分會將布爾數組聚合成單個真或假。要使結果爲真,searchParams中的所有鍵值對必須產生一個true值。否則,減少部分將爲該用戶返回false,這意味着它們被過濾掉。

+0

感謝@julian索勒,作品般的魅力,試圖用兩個以上的搜索PARAMS太。 :) – Mahen

2

使用_.every()迭代searchParams,因此,如果任何檢查失敗,該項目被過濾掉:

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>