循环对象检查是否存在特定属性,是否有更好的方法可能使用下划线?

时间:2015-09-02 20:50:56

标签: javascript underscore.js

我有一个对象数组,想检查一个特定的键/值是否存在,我目前正在使用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');
}

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

4 个答案:

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