【问题标题】:Javascript: JSON with multiple matches using lodashJavascript:使用 lodash 进行多个匹配的 JSON
【发布时间】:2016-02-20 06:34:23
【问题描述】:

假设我有一个如下所示的数组:

var users = [{
    users : [{
        user :'harry'
    }, {
        user : 'potter'
    }, {
        user : 'jinny'
    }, {
        user : 'weasly'
    }],
    age : 36,
    active : true
}, {
    users : [{
        user : 'brad'
    }, {
        user : 'pit'
    }, {
        user : 'angelena'
    }, {
        user : 'joly'
    }],
    age : 40,
    active : false 
}];

由此,我想根据条件users 选择可以匹配多个值的对象

例如,如果名称是harryangelena,则输出变为:

{
    users : [{
        user : 'harry'
    },{
        user : 'potter'
    }, {
        user : 'jinny'
    }, {
        user : 'weasly'
    }],
    age : 36,
    active : true
}, {
    users : [{
        user : 'brad'
    } ,{
        user : 'pit'
    }, {
        user : 'angelena'
    }, {
        user : 'joly'
    }],
    age : 40,
    active : false
}

如果名字是harry,输出变成这样:

{
    users : [{
        user : 'harry'
    }, {
        user : 'potter'
    }, {
        user : 'jinny'
    }, {
        user : 'weasly'
    }],
    age : 36,
    active : true
}

我知道lodash filter with matches 可以用于此,但我不知道如何将其应用于这种情况。

有没有针对这个问题的 javaScript 或 jQuery 解决方案?

【问题讨论】:

  • users.users 中的键名不应该是唯一的吗?
  • 是的users.user它的独特之处
  • 但是有四个键都是user,每个键都有不同的值。 JSON 不需要唯一键,但建议键是唯一的(除非您有其他正当理由)。 JS 通常会覆盖重复键的先前值。
  • 对不起,这是一个错字,现在我已经修正了

标签: javascript jquery json lodash


【解决方案1】:

这是一个可能的解决方案:

function search(usersCollection, targets) {
    return _.filter(usersCollection, function (usersObj) {
        return _.intersection(targets, _.map(usersObj.users, 'user')).length > 0;
    });
}

用法:

search(users, ['harry', 'angelena'])
/* => [{ 'users': [{user:'harry'},{user:'potter'},{user:'jinny'},{user:'weasly'}], 'age': 36, 'active': true },
       { 'users': [{user:'brad'},{user:'pit'},{user:'angelena'},{user:'joly'}],   'age': 40, 'active': false }] */
search(users, ['harry'])
/* => [{ 'users': [{user:'harry'},{user:'potter'},{user:'jinny'},{user:'weasly'}], 'age': 36, 'active': true }] */
search(users, ['severus'])
/* => [] */
search(users, [])
/* => [] */

它的工作原理是过滤users 集合,首先只从每个用户组中提取名称(使用_.map),然后找到与targets 相同的名称进行搜索。如果有共同的名称 (.length > 0),则至少找到一个目标名称,并且特定用户组包含在结果中。

如果目标/用户列表很长,此实现可能效率低下。如果这是一个问题,请考虑优化您的数据结构。

【讨论】:

    【解决方案2】:

    你好我创建了两个参数数组:

    var params1 = ['harry','jinny'];//params of the same users object
    var param2 = ['potter','pit'];//params of both users objects
    

    我创建了过滤函数来返回过滤后的数组

    这里过滤用户数组并比较参数,最后我将过滤后的数组返回给res数组变量:

    var res = users.filter(function(user){
         for(var i=0;i<user.users.length;i++){
                //below iterate into params1 or params2 array
                for(var x=0;x<params2.length;x++){
                    if(user.users[i].user == params2[x]){
                      return user;
                    }//end if
                }//end for
    
        }//end for
    
       });//end filter
    

    请在浏览器中打开您的控制台并将代码粘贴到那里以查看结果。 希望有所帮助,祝你好运。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-06-01
      • 2019-02-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-31
      • 1970-01-01
      相关资源
      最近更新 更多