猿问

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

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

我有一个数组

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

如何检查这个数组以确定Magenic是否存在?我不想循环,除非我必须这样做。我可能有几千张唱片。

更新

由于这是一个很受欢迎的帖子,我想我应该分享一些我发现的新东西。看来@CAFxX已经分享了这一点!我应该多读些这些。我偶然发现https:/benfrain.com/谅解-原生-javascript-数组-方法/.

vendors.filter(function(vendor){ return vendor.Name === "Magenic" });

对于ECMAScript 2015,使用新的箭头函数甚至更简单:

vendors.filter(vendor => (vendor.Name === "Magenic"));


湖上湖
浏览 334回答 3
3回答

30秒到达战场

没有“魔术”的方法来检查数组中没有循环的东西。即使您使用某些函数,该函数本身也将使用一个循环。你能做的是,一旦你找到你想要的东西来减少计算时间,就从循环中挣脱出来。var&nbsp;found&nbsp;=&nbsp;false;for(var&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;<&nbsp;vendors.length;&nbsp;i++)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(vendors[i].Name&nbsp;==&nbsp;'Magenic')&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;found&nbsp;=&nbsp;true; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break; &nbsp;&nbsp;&nbsp;&nbsp;}}

森栏

不需要重新发明车轮循环,至少不显式(使用箭头函数,&nbsp;只适用于现代浏览器):if&nbsp;(vendors.filter(e&nbsp;=>&nbsp;e.Name&nbsp;===&nbsp;'Magenic').length&nbsp;>&nbsp;0)&nbsp;{ &nbsp;&nbsp;/*&nbsp;vendors&nbsp;contains&nbsp;the&nbsp;element&nbsp;we're&nbsp;looking&nbsp;for&nbsp;*/}或,更好:if&nbsp;(vendors.some(e&nbsp;=>&nbsp;e.Name&nbsp;===&nbsp;'Magenic'))&nbsp;{ &nbsp;&nbsp;/*&nbsp;vendors&nbsp;contains&nbsp;the&nbsp;element&nbsp;we're&nbsp;looking&nbsp;for&nbsp;*/}编辑:如果你需要与糟糕的浏览器兼容,那么你最好的选择是:if&nbsp;(vendors.filter(function(e)&nbsp;{&nbsp;return&nbsp;e.Name&nbsp;===&nbsp;'Magenic';&nbsp;}).length&nbsp;>&nbsp;0)&nbsp;{ &nbsp;&nbsp;/*&nbsp;vendors&nbsp;contains&nbsp;the&nbsp;element&nbsp;we're&nbsp;looking&nbsp;for&nbsp;*/}

小怪兽爱吃肉

不需要循环。出现在脑海中的三种方法:Array.Prototype.这是你的问题最准确的答案,即“检查是否存在某物”,这意味着一个错误的结果。如果有“Magenic”对象,则为真,否则为假:let&nbsp;hasMagenicVendor&nbsp;=&nbsp;vendors.some(&nbsp;vendor&nbsp;=>&nbsp;vendor['Name']&nbsp;===&nbsp;'Magenic'&nbsp;)Array.Prototype.filter()这将返回所有“Magenic”对象的数组,即使只有一个(将返回一个元素数组):let&nbsp;magenicVendors&nbsp;=&nbsp;vendors.filter(&nbsp;vendor&nbsp;=>&nbsp;vendor['Name']&nbsp;===&nbsp;'Magenic'&nbsp;)如果你试图强迫这个布尔值,它将不能工作,因为一个空数组(没有‘Magenic’对象)仍然是真实的。所以就用magenicVendors.length在你的条件下。Array.Prototype.find()这将返回第一个“Magenic”对象(或undefined如果没有):let&nbsp;magenicVendor&nbsp;=&nbsp;vendors.find(&nbsp;vendor&nbsp;=>&nbsp;vendor['Name']&nbsp;===&nbsp;'Magenic'&nbsp;);这会胁迫到布尔OK(任何物体都是真实的,undefined是虚假的)。注意:我使用的是供应商[“名称”],而不是供应商名称,因为属性名称的大小写很奇怪。注2:在检查名称时,没有理由使用松散相等(=)而不是严格相等(=)。
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答