我有一个数组

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

我如何检查这个数组,看看“Magenic”是否存在?我不想循环,除非迫不得已。我可能要处理几千条记录。


当前回答

如果我错了请指正。 我可以像这样使用每种方法,

var found=false;
vendors.forEach(function(item){
   if(item.name === "name"){
       found=true;

   }
});

现在我已经习惯了,因为它简单明了。 谢谢你!

其他回答

你必须循环,这是没有办法的。

function seekVendor(vendors, name) {
  for (var i=0, l=vendors.length; i<l; i++) {
    if (typeof vendors[i] == "object" && vendors[i].Name === name) {
      return vendors[i];
    }
  }
}

当然,你可以使用像linq.js这样的库来让它更令人满意:

Enumerable.From(vendors).Where("$.Name == 'Magenic'").First();

(参见jsFiddle的演示)

我怀疑linq.js会比直接的循环更快,但当事情变得有点复杂时,它肯定会更灵活。

不需要重新发明轮子循环,至少不显式地(使用箭头函数,仅限现代浏览器):

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

或者,更好的是,使用some,因为它允许浏览器在找到匹配的元素时立即停止,所以它会更快:

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

或等价的(在这种情况下)找到:

if (vendors.find(e => e.Name === 'Magenic')) {
  /* same result as above, but a different function return type */
}

你甚至可以通过使用findIndex来获取该元素的位置:

const i = vendors.findIndex(e => e.Name === 'Magenic');
if (i > -1) {
  /* vendors contains the element we're looking for, at index "i" */
}

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

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

我宁愿用正则表达式。

如果您的代码如下所示,

vendors = [
    {
      Name: 'Magenic',
      ID: 'ABC'
     },
    {
      Name: 'Microsoft',
      ID: 'DEF'
    }
];

我推荐

/"Name":"Magenic"/.test(JSON.stringify(vendors))

如果我错了请指正。 我可以像这样使用每种方法,

var found=false;
vendors.forEach(function(item){
   if(item.name === "name"){
       found=true;

   }
});

现在我已经习惯了,因为它简单明了。 谢谢你!

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

Array.prototype.some ()

这是对你的问题最准确的回答。"check if something exists",表示bool类型的结果。如果有任何“Magenic”物体,这将是正确的,否则为假:

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

Array.prototype.filter ()

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

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

如果你试图将其强制为布尔值,它将不起作用,因为空数组(没有'Magenic'对象)仍然为真。所以使用魔法供应商。条件句中的长度。

Array.prototype.find ()

这将返回第一个“Magenic”对象(如果没有,则未定义):

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

这将强制转换为布尔值(任何对象为真,未定义为假)。


注意:我使用vendor[“名称”]而不是vendor。名称,因为属性名的大小写很奇怪。

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