【问题标题】:What is the simplest way to search in JSON by attribute?按属性在 JSON 中搜索的最简单方法是什么?
【发布时间】:2018-01-12 02:38:15
【问题描述】:
"names": [
    {
        "id": 17,
        "user_id": 9,
        "code": "de",
        "name": "Ich bin Hans",
        "created_at": "2017-07-31 12:43:19",
        "updated_at": "2017-07-31 12:43:19"
    },
    {
        "id": 18,
        "user_id": 9,
        "code": "en",
        "name": "My name is Hans",
        "created_at": "2017-07-31 12:43:19",
        "updated_at": "2017-07-31 12:43:19"
    }
]

有没有什么方法可以从上面的 jQuery 中的 JSON 数组中获取带有code='en' 的 JSON 对象?

我可以用forloop 做到这一点,但我想也许有更简单的方法来做到这一点。

【问题讨论】:

标签: javascript jquery arrays json


【解决方案1】:

在 vanilla JS 中使用Array.prototype.filter 函数来过滤对象 - 参见下面的演示:

var obj={names:[{id:17,user_id:9,code:"de",name:"Ich bin Hans",created_at:"2017-07-31 12:43:19",updated_at:"2017-07-31 12:43:19"},{id:18,user_id:9,code:"en",name:"My name is Hans",created_at:"2017-07-31 12:43:19",updated_at:"2017-07-31 12:43:19"}]};

var result = obj.names.filter(function(e){return e.code == 'en'})
console.log(result);

ES6 版本更简单:

var obj={names:[{id:17,user_id:9,code:"de",name:"Ich bin Hans",created_at:"2017-07-31 12:43:19",updated_at:"2017-07-31 12:43:19"},{id:18,user_id:9,code:"en",name:"My name is Hans",created_at:"2017-07-31 12:43:19",updated_at:"2017-07-31 12:43:19"}]};

var result = obj.names.filter(e => e.code == 'en');
console.log(result);

【讨论】:

    【解决方案2】:

    使用Jquery grep function。实际上,您不是在搜索对象,而是在搜索对象数组(names)。

    查找数组中满足过滤函数的元素。原数组不受影响。

     var input = {names:[{id:17,user_id:9,code:"de",name:"Ich bin Hans",created_at:"2017-07-31 12:43:19",updated_at:"2017-07-31 12:43:19"},{id:18,user_id:9,code:"en",name:"My name is Hans",created_at:"2017-07-31 12:43:19",updated_at:"2017-07-31 12:43:19"}]};
     
    var result = $.grep(input.names, function(obj) {
        return obj.code === "en";
    });
    console.log(result);
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

    另一个是Array#find函数

    var input = {names:[{id:17,user_id:9,code:"de",name:"Ich bin Hans",created_at:"2017-07-31 12:43:19",updated_at:"2017-07-31 12:43:19"},{id:18,user_id:9,code:"en",name:"My name is Hans",created_at:"2017-07-31 12:43:19",updated_at:"2017-07-31 12:43:19"}]};
     
    var result = input.names.find(item => {
       return item.code == 'en'
    })
    console.log(result);

    【讨论】:

    • $.grep 对应 ES5 filter,而不是 ES6 find
    • @Bergi grepfind 没有关联?
    【解决方案3】:

    如果你不想用 for 循环来做,试试 ES5 数组函数,过滤器

    names = names.filer(function(item) {
      return item.code === 'en'
    })
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-24
      • 2021-04-24
      • 1970-01-01
      • 1970-01-01
      • 2015-06-08
      • 2021-06-26
      • 1970-01-01
      相关资源
      最近更新 更多