簡體   English   中英

lodash:通過另一個JSON對象過濾對象數組

[英]lodash:Filtering Array of objects by another JSON Object

我正在嘗試使用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"}

如果第一個數組對象的用戶包含第二個對象的用戶,並且第一個對象名稱包含第二個對象名稱,而不是我想要的對象。

_.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 }任何幫助將不勝感激。任何想法

你的問題是,在你的iteratee功能_.forOwn ,如果僅僅是用戶名或字段的一個產生一個匹配,那么整個用戶對象被認為是匹配的。

為了產生預期的結果,您可以實施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中的鍵值對是否匹配。 reduce部分將布爾數組聚合為單個true或false。 要得出true值, searchParams所有鍵值對必須產生true值。 否則,reduce部分將對該用戶返回false,這意味着他們將被過濾掉。

使用_.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> 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM