Javascript lodash:通过另一个JSON对象过滤对象数组

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

我试图通过另一个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", '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);
});