我有一个数组
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”是否存在?我不想循环,除非迫不得已。我可能要处理几千条记录。
当前回答
你不能不看物体本身。
你也许应该稍微改变一下你的结构,比如
vendors = {
Magenic: 'ABC',
Microsoft: 'DEF'
};
然后你就可以像使用查找哈希一样使用它。
vendors['Microsoft']; // 'DEF'
vendors['Apple']; // undefined
其他回答
不需要重新发明轮子循环,至少不显式地(使用箭头函数,仅限现代浏览器):
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 */
}
为了比较一个对象和另一个对象,我结合了for in循环(用于遍历对象)和some()。 你不必担心数组越界等问题,这样可以节省一些代码。一些文档可以在这里找到
var productList = [{id: 'text3'}, {id: 'text2'}, {id: 'text4', product: 'Shampoo'}]; // Example of selected products
var theDatabaseList = [{id: 'text1'}, {id: 'text2'},{id: 'text3'},{id:'text4', product: 'shampoo'}];
var objectsFound = [];
for(let objectNumber in productList){
var currentId = productList[objectNumber].id;
if (theDatabaseList.some(obj => obj.id === currentId)) {
// Do what you need to do with the matching value here
objectsFound.push(currentId);
}
}
console.log(objectsFound);
我比较一个对象和另一个对象的另一种方法是使用object .keys()的嵌套for循环。长度来获取数组中对象的数量。下面的代码:
var productList = [{id: 'text3'}, {id: 'text2'}, {id: 'text4', product: 'Shampoo'}]; // Example of selected products
var theDatabaseList = [{id: 'text1'}, {id: 'text2'},{id: 'text3'},{id:'text4', product: 'shampoo'}];
var objectsFound = [];
for(var i = 0; i < Object.keys(productList).length; i++){
for(var j = 0; j < Object.keys(theDatabaseList).length; j++){
if(productList[i].id === theDatabaseList[j].id){
objectsFound.push(productList[i].id);
}
}
}
console.log(objectsFound);
为了回答你的确切问题,如果你只是在一个对象中搜索一个值,你可以使用一个for in循环。
var vendors = [
{
Name: 'Magenic',
ID: 'ABC'
},
{
Name: 'Microsoft',
ID: 'DEF'
}
];
for(var ojectNumbers in vendors){
if(vendors[ojectNumbers].Name === 'Magenic'){
console.log('object contains Magenic');
}
}
你不能不看物体本身。
你也许应该稍微改变一下你的结构,比如
vendors = {
Magenic: 'ABC',
Microsoft: 'DEF'
};
然后你就可以像使用查找哈希一样使用它。
vendors['Microsoft']; // 'DEF'
vendors['Apple']; // undefined
你必须循环,这是没有办法的。
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会比直接的循环更快,但当事情变得有点复杂时,它肯定会更灵活。
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解决方案的替代方案。