我有一个对象数组,想检查一个特定的键/值是否存在,我目前正在使用for..in循环,但是想知道是否有更短/更好的方法来执行此操作? / p>
JS
var models = [
{
"id": 1,
"name": "James"
},
{
"id": 2,
"name": "Ken"
},
{
"id": 3,
"name": "Jason"
}
];
function checkNameExists(name) {
for( var model in models ) {
if (models[model].name === name) {
return true;
}
}
}
var nameExists = checkNameExists("Ken");
if(nameExists) {
console.log('Name exists');
}
答案 0 :(得分:3)
您可以使用下划线某些功能:
var nameExists = _.some(models, function (elem) {
return elem.name == "Jason"
})
或在Ahmad Mageed建议的较短版本中:
var useFound = _.some(models,{ 'name': 'Jasonn' });
这是一个JSFiddle:http://jsfiddle.net/c21opmj8/2/
答案 1 :(得分:2)
在简单的香草中,您可以在任何数组上使用some
function checkNameExists(name) {
return models.some(function(e){return e.name===name;});
}
(因为你不需要循环,所以也可以在没有这个功能的情况下使用)
如果arrow functions获得广泛支持,可读性会更好;)然后您可以使用models.some(e => e.name===name)
答案 2 :(得分:1)
不依赖外部库,Array.filter()
完成工作:
models.filter( (x) => x.name==="Jason" )
Array.find()
找到第一次出现并停止,因此它更快。
答案 3 :(得分:0)
以下是带下划线的解决方案
console.clear();
var models = [
{
"id": 1,
"name": "James"
},
{
"id": 2,
"name": "Ken"
},
{
"id": 3,
"name": "Jason"
}
];
var tab_name = _.map(models, function(x){return x.name});
var name_exists = _.contains( tab_name , 'Ken')
if( name_exists ) {
console.log('Name exists');
}