循环对象来检查特定属性是否存在,有没有更好的方法,比如使用下划线

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

本文关键字:方法 更好 下划线 有没有 循环 检查 属性 存在 是否 对象      更新时间:2023-09-26

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

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

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

(也可以不使用该函数,因为您不需要循环)

如果箭头函数得到广泛的支持,可读性会更好;)然后你可以使用models.some(e => e.name===name)

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

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

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

这里有一个下划线

的解决方案
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');
}