我正在尝试使用 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"}
如果第一个数组对象的用户包含第二个对象的用户,并且第一个对象名称包含第二个对象名称,而不是我想要的对象。我尝试了此代码,但它返回的是 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 }
任何帮助将不胜感激。任何想法
最佳答案
您的问题是,在 _.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
将检查每个用户并提供一个数组或 bool 值,告诉您 searchParams
中的键值对是否匹配。减少部分将把 bool 数组聚合成单个 true 或 false。要得到 true,searchParams
中的所有键值对都必须生成 true
值。否则,reduce 部分将为该用户返回 false,这意味着他们被过滤掉。
关于javascript - lodash:通过另一个 JSON 对象过滤对象数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44470276/