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>