【问题标题】:lodash:Filtering Array of objects by another JSON Objectlodash:通过另一个 JSON 对象过滤对象数组
【发布时间】:2017-06-10 06:24:12
【问题描述】:

我正在尝试通过另一个 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 条件而不是 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 } 任何帮助将不胜感激。任何想法

【问题讨论】:

    标签: javascript arrays json underscore.js lodash


    【解决方案1】:

    您的问题是,在您的 _.forOwn 的 iteratee 函数中,如果只有用户或名称字段之一产生匹配,则整个用户对象被视为匹配。

    要产生您的预期结果,您可以实施 map reduce。将您的代码替换为以下内容(此 sn-p 使用 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 部分将为该用户返回 false,这意味着他们被过滤掉了。

    【讨论】:

    • 感谢@julian soro,像魅力一样工作,也尝试了两个以上的搜索参数。 :)
    【解决方案2】:

    使用_.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>

    【讨论】:

      猜你喜欢
      • 2021-10-30
      • 2019-05-05
      • 2019-07-18
      • 2020-01-27
      • 2018-09-06
      • 1970-01-01
      • 1970-01-01
      • 2018-10-03
      相关资源
      最近更新 更多