我有一个数组
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”是否存在?我不想循环,除非迫不得已。我可能要处理几千条记录。
当前回答
不需要循环。我想到了三种方法:
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:在检查名称时,没有理由使用松散相等(==)而不是严格相等(===)。
其他回答
除非你想这样重组:
vendors = {
Magenic: {
Name: 'Magenic',
ID: 'ABC'
},
Microsoft: {
Name: 'Microsoft',
ID: 'DEF'
} and so on...
};
你可以这样做如果(vendor . magnetic)
你必须循环
你必须循环,这是没有办法的。
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会比直接的循环更快,但当事情变得有点复杂时,它肯定会更灵活。
const check = vendors.find((item)=>item.Name==='Magenic')
console.log(check)
试试这段代码。
如果项目或元素存在,则输出将显示该元素。如果它不存在,那么输出将是“未定义的”。
或者你可以这样做:
const find = (key, needle) => return !!~vendors.findIndex(v => (v[key] === needle));
因为OP询问了密钥是否存在的问题。
使用ES6 reduce函数返回布尔值的更优雅的解决方案可以是
const magenicVendorExists = vendors.reduce((accumulator, vendor) => (accumulator||vendor.Name === "Magenic"), false);
注意:reduce的初始参数是false,如果数组有键,它将返回true。
希望它有助于更好和更清晰的代码实现