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

Looping objects to check if specific property exists, is there a nicer way maybe using underscore?

我有一个对象数组,想检查是否存在特定的 key/value,我目前正在使用 for..in 循环,但想知道是否有 shorter/better 方法来这样做?

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/

你可以使用下划线的some函数:

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

或按照 Ahmad Mageed 建议的更短版本:

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

这是一个 JSFiddle:http://jsfiddle.net/c21opmj8/2/

在普通香草中,您可以在任何数组上使用 some

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

(也可以在没有函数的情况下使用,因为你不需要循环)

如果arrow functions得到广泛的支持,可读性会更好;)那么你可以使用models.some(e => e.name===name)

下面是带下划线的解决方案

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

不依赖外部库,Array.filter() 完成工作:

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

Array.find() 找到第一次出现并停止,因此速度更快。