[英]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.