我有一个数组
vendors = [{
Name: 'Magenic',
ID: 'ABC'
},
{
Name: 'Microsoft',
ID: 'DEF'
} // and so on...
];
我如何检查这个数组,看看“Magenic”是否存在?我不想循环,除非迫不得已。我可能要处理几千条记录。
我有一个数组
vendors = [{
Name: 'Magenic',
ID: 'ABC'
},
{
Name: 'Microsoft',
ID: 'DEF'
} // and so on...
];
我如何检查这个数组,看看“Magenic”是否存在?我不想循环,除非迫不得已。我可能要处理几千条记录。
当前回答
2021解决方案*
Lodash .some (docs)是一个干净的解决方案,如果你使用_matchesProperty (docs)速记:
_.some(VENDORS, ['Name', 'Magenic'])
解释
这将遍历供应商数组,寻找Name键值为字符串'Magenic'的元素对象。一旦找到这个元素,它就返回true并停止迭代。如果在遍历整个数组后仍未找到该元素,则返回false。
代码片段
const vendor =[{名称:'Magenic', ID: 'ABC'},{名称:'Microsoft', ID: 'DEF'}]; console.log(_。some(vendor, ['Name', 'Magenic']));/ /正确的 < script src = " https://cdn.jsdelivr.net/npm/lodash@4.17.20 lodash.min.js " > < /脚本>
*注意,这使用流行的lodash库来实现最简单/最短的解决方案。对于那些感兴趣的人,我提供这个作为现有香草JS解决方案的替代方案。
其他回答
因为OP询问了密钥是否存在的问题。
使用ES6 reduce函数返回布尔值的更优雅的解决方案可以是
const magenicVendorExists = vendors.reduce((accumulator, vendor) => (accumulator||vendor.Name === "Magenic"), false);
注意:reduce的初始参数是false,如果数组有键,它将返回true。
希望它有助于更好和更清晰的代码实现
可能太晚了,但是javascript数组有两个方法,每个方法都返回一个布尔值,可以帮助你实现这一点。
我觉得有些最适合你想要达到的目标。
vendors.some( vendor => vendor['Name'] !== 'Magenic' )
一些函数验证数组中的任何对象是否满足给定条件。
vendors.every( vendor => vendor['Name'] !== 'Magenic' )
Every验证数组中的所有对象都满足给定条件。
这里的许多答案都很好,也很简单。但如果你的对象数组有一个固定的值集,那么你可以使用下面的技巧:
映射一个对象中的所有名称。
vendors = [
{
Name: 'Magenic',
ID: 'ABC'
},
{
Name: 'Microsoft',
ID: 'DEF'
}
];
var dirtyObj = {}
for(var count=0;count<vendors.length;count++){
dirtyObj[vendors[count].Name] = true //or assign which gives you true.
}
现在这个dirtyObj你可以一次又一次地使用,没有任何循环。
if(dirtyObj[vendor.Name]){
console.log("Hey! I am available.");
}
除非你想这样重组:
vendors = {
Magenic: {
Name: 'Magenic',
ID: 'ABC'
},
Microsoft: {
Name: 'Microsoft',
ID: 'DEF'
} and so on...
};
你可以这样做如果(vendor . magnetic)
你必须循环
2018编辑:这个答案来自2011年,当时浏览器还没有广泛支持数组过滤方法和箭头函数。来看看CAFxX的答案吧。
没有“神奇”的方法可以在没有循环的情况下检查数组中的内容。即使你使用某个函数,这个函数本身也会使用循环。您可以做的是,一旦找到要查找的内容,就立即跳出循环,以最小化计算时间。
var found = false;
for(var i = 0; i < vendors.length; i++) {
if (vendors[i].Name == 'Magenic') {
found = true;
break;
}
}