Javascript lodash:通过另一个JSON对象过滤对象数组
我试图通过另一个JSON对象使用lodash过滤对象数组Javascript lodash:通过另一个JSON对象过滤对象数组,javascript,arrays,json,underscore.js,lodash,Javascript,Arrays,Json,Underscore.js,Lodash,我试图通过另一个JSON对象使用lodash过滤对象数组 var users = [ { 'user': 'barney', 'name': "donald", 'active': true }, { 'user': 'joe', 'name': "john", 'active': false }, { 'user': 'fred', 'name': "peri", 'active': false }, { 'user': 'fred', 'name': "aru", 'acti
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条件not和condition
_.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}
任何帮助都将不胜感激。任何想法您的问题是,在您的
\uOwn
的iteratee函数中,如果只有一个user或name字段产生匹配,那么整个user对象将被视为匹配
要产生预期的结果,可以实现map reduce。将代码替换为以下内容(此代码段使用lodash):
在这种情况下,
.\map
将检查每个用户,并提供一个数组或布尔值,告诉您searchParams
中的键值对是否匹配。reduce部分将布尔数组聚合为一个true或false。若要生成true,则searchParams
中的所有键值对必须生成true
值。否则,对于该用户,reduce部分将返回false,这意味着它们将被过滤掉。您的问题是,在您的\uOwn.forOwn的iteratee函数中,如果只有一个user或name字段产生匹配,那么整个user对象将被视为匹配
要产生预期的结果,可以实现map reduce。将代码替换为以下内容(此代码段使用lodash):
在这种情况下,.\map
将检查每个用户,并提供一个数组或布尔值,告诉您searchParams
中的键值对是否匹配。reduce部分将布尔数组聚合为一个true或false。若要生成true,则searchParams
中的所有键值对必须生成true
值。否则,对于该用户,reduce部分将返回false,这意味着他们将被过滤掉。使用\uu.every()
迭代searchParams
,因此如果任何检查失败,该项将被过滤掉:
var用户=[
{'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=u2;.filter(用户,函数(o)){
return u.every(searchParams,function(v,k){
返回值u.包括(o[k],v);
});
});
控制台日志(结果)代码>
使用\.each()
迭代搜索参数
,因此如果任何检查失败,该项将被过滤掉:
var用户=[
{'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=u2;.filter(用户,函数(o)){
return u.every(searchParams,function(v,k){
返回值u.包括(o[k],v);
});
});
控制台日志(结果)代码>
谢谢@julian soro,像charm一样工作,也尝试了两个以上的搜索参数。:)谢谢@julian soro,像charm一样工作,也尝试了两个以上的搜索参数。:)
_.filter(users, function(o) {
return _.map(searchParams, function(v,k) {
return _.includes(o[k],v)
}).reduce(function(isMatch, keyValueMatch){
return isMatch && keyValueMatch
}, true);
});