在JSON中根据属性进行搜索的最简单方法是什么?

7
"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对象?我可以用for循环来实现,但我认为可能有更简单的方法。

1
可能是ES6:通过其属性之一在数组中查找对象的重复问题。 - Mohideen bin Mohammed
3个回答

12

使用原生 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);


7

使用JQuery grep函数。实际上,你不是在搜索对象,而是在搜索对象数组(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 corresponds to ES5 filter, not ES6 find - Bergi
1
@Bergi grepfind没有任何关系? - Suresh Atta

0
如果您不想使用for循环,可以尝试ES5数组函数filter。
names = names.filer(function(item) {
  return item.code === 'en'
})

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接