2015-09-02 2 views
0

У меня есть массив объектов и вы хотите проверить, существует ли конкретный ключ/значение, в настоящее время я использую цикл for..in, но задавался вопросом, есть ли более короткий/лучший способ сделать это?Зацикливание объектов, чтобы проверить, существует ли определенная собственность, есть ли лучший способ, возможно, использовать подчеркивание?

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'); 
} 

JSFiddle: http://jsfiddle.net/kyllle/c21opmj8/1/

ответ

3

Вы можете использовать подчеркивание-х некоторые функции:

var nameExists = _.some(models, function (elem) { 
      return elem.name == "Jason" 
}) 

или в более короткой версии, как Ахмад Mageed предложил:

var useFound = _.some(models,{ 'name': 'Jasonn' }); 

Вот JSFiddle: http://jsfiddle.net/c21opmj8/2/

+1

С помощью LoDash это может быть короче: '_. some (модели, 'name', 'Jason')'. Другой вариант для LoDash и Underscore: '_.some (models, {'name': 'Jason'})' –

2

В простой ванили, вы можете использовать some на любом массиве

function checkNameExists(name) { 
    return models.some(function(e){return e.name===name;}); 
} 

(может использоваться без функции, а так как вам не нужно цикл)

Если arrow functions получить широкую поддержку распространения, читаемость будет лучше;) Тогда вы могли бы использовать models.some(e => e.name===name)

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'); 
} 
1

Вне зависимости от внешних библиотек, Array.filter() делает работу:

models.filter((x) => x.name==="Jason") 

Array.find() находит первое вхождение и останавливается, следовательно, это быстрее.

Смежные вопросы