lodash:Filtering 另一个 JSON 对象的对象数组
lodash:Filtering Array of objects by another JSON Object
我正在尝试通过另一个 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"}
如果第一个数组对象的用户包含第二个对象的用户,而第一个对象名称包含第二个对象名称,那么我希望 object.I 尝试过此代码,但它 returns 的 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;
});
下面这个returns结果
[{ 'user': 'barney', 'name': "donald", 'active': true },{ 'user': 'barney', 'name': "resaj", 'active': false }]
我只想要第一个对象{ 'user': 'barney', 'name': "donald", 'active': true }
任何帮助都是 appreciated.Any idea
您的问题是,在您的 _.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 部分将为 return 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>
我正在尝试通过另一个 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"}
如果第一个数组对象的用户包含第二个对象的用户,而第一个对象名称包含第二个对象名称,那么我希望 object.I 尝试过此代码,但它 returns 的 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;
});
下面这个returns结果
[{ 'user': 'barney', 'name': "donald", 'active': true },{ 'user': 'barney', 'name': "resaj", 'active': false }]
我只想要第一个对象{ 'user': 'barney', 'name': "donald", 'active': true }
任何帮助都是 appreciated.Any idea
您的问题是,在您的 _.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 部分将为 return 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>