协慌网

登录 贡献 社区

如何确定 Javascript 数组是否包含具有等于给定值的属性的对象?

我有一个像

vendors = [{
    Name: 'Magenic',
    ID: 'ABC'
  },
  {
    Name: 'Microsoft',
    ID: 'DEF'
  } // and so on... 
];

如何检查此数组以查看是否存在 “Magenic”?我不想循环,除非必须这样做。我正在处理几千条记录。

答案

无需重新发明车轮循环,至少没有明确地循环(仅使用箭头功能仅适用于现代浏览器):

if (vendors.filter(e => e.Name === 'Magenic').length > 0) {
  /* vendors contains the element we're looking for */
}

或者,更好的是

if (vendors.some(e => e.Name === 'Magenic')) {
  /* vendors contains the element we're looking for */
}

编辑:如果您需要与糟糕的浏览器兼容,那么最好的选择是:

if (vendors.filter(function(e) { return e.Name === 'Magenic'; }).length > 0) {
  /* vendors contains the element we're looking for */
}

2018 edit :这个答案来自 2011,当时浏览器还没有广泛支持数组过滤方法和箭头功能。看一下CAFxX 的答案

没有 “魔术” 的方法来检查没有循环的数组中的某些内容。即使使用某些函数,该函数本身也会使用循环。您可以做的是,一旦找到所需的内容,便可以打破循环,以最大程度地减少计算时间。

var found = false;
for(var i = 0; i < vendors.length; i++) {
    if (vendors[i].Name == 'Magenic') {
        found = true;
        break;
    }
}

无需循环。我想到了三种方法:

Array.prototype.some()

这是针对您问题的最准确答案,即 “检查是否存在某些东西”,这意味着出现布尔值。如果存在任何 “Magenic” 对象,则为 true,否则为 false:

let hasMagenicVendor = vendors.some( vendor => vendor['Name'] === 'Magenic' )

Array.prototype.filter()

这将返回所有 “Magenic” 对象的数组,即使只有一个(将返回一个单元素的数组):

let magenicVendors = vendors.filter( vendor => vendor['Name'] === 'Magenic' )

如果您尝试将其强制为布尔值,则它将不起作用,因为空数组(没有 “Magenic” 对象)仍然是事实。因此,只需在您的条件中magenicVendors.length

Array.prototype.find()

这将返回第一个 “Magenic” 对象( undefined则为 undefined):

let magenicVendor = vendors.find( vendor => vendor['Name'] === 'Magenic' );

这强制为布尔值(任何对象都是真实的, undefined是虚假的)。


注意:由于属性名称的大小写很怪异,因此我使用 vendor [“Name”] 而不是 vendor.Name。

注意 2:检查名称时,没有理由使用宽松的等号(==)而不是严格的等号(===)。