我有一个数组
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”是否存在?我不想循环,除非迫不得已。我可能要处理几千条记录。
当前回答
map、filter、find和类似的函数比简单的循环要慢。 对我来说,它们也比简单的循环更难读,更难调试。使用它们看起来像是一种非理性的仪式。
最好是这样的:
arrayHelper = {
arrayContainsObject: function (array, object, key){
for (let i = 0; i < array.length; i++){
if (object[key] === array[i][key]){
return true;
}
}
return false;
}
};
在给定OP的例子中使用它:
vendors = [{
Name: 'Magenic',
ID: 'ABC'
},
{
Name: 'Microsoft',
ID: 'DEF'
}
];
let abcObject = {ID: 'ABC', Name: 'Magenic'};
let isContainObject = arrayHelper.arrayContainsObject(vendors, abcObject, 'ID');
其他回答
你必须循环,这是没有办法的。
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会比直接的循环更快,但当事情变得有点复杂时,它肯定会更灵活。
除非你想这样重组:
vendors = {
Magenic: {
Name: 'Magenic',
ID: 'ABC'
},
Microsoft: {
Name: 'Microsoft',
ID: 'DEF'
} and so on...
};
你可以这样做如果(vendor . magnetic)
你必须循环
可能太晚了,但是javascript数组有两个方法,每个方法都返回一个布尔值,可以帮助你实现这一点。
我觉得有些最适合你想要达到的目标。
vendors.some( vendor => vendor['Name'] !== 'Magenic' )
一些函数验证数组中的任何对象是否满足给定条件。
vendors.every( vendor => vendor['Name'] !== 'Magenic' )
Every验证数组中的所有对象都满足给定条件。
如果你正在使用jquery,你可以利用grep来创建所有匹配对象的数组:
var results = $.grep(vendors, function (e) {
return e.Name == "Magenic";
});
然后使用结果数组:
for (var i=0, l=results.length; i<l; i++) {
console.log(results[i].ID);
}
我是这么做的
const found = vendors.some(item => item.Name === 'Magenic');
array.some()方法检查数组中是否至少有一个值符合条件,并返回一个布尔值。 从这里开始,你可以选择:
if (found) {
// do something
} else {
// do something else
}