Javascript 基于对象映射检查数组中的任何值是否为false的最有效方法
我正在处理一个具有一个布尔值的键的对象。我试图找到一种最有效的方法来检查我从一个数组中接收到的任何值是否在具有相关键的对象中等于false 例如,我有这样一个对象:Javascript 基于对象映射检查数组中的任何值是否为false的最有效方法,javascript,optimization,Javascript,Optimization,我正在处理一个具有一个布尔值的键的对象。我试图找到一种最有效的方法来检查我从一个数组中接收到的任何值是否在具有相关键的对象中等于false 例如,我有这样一个对象: cars = { bmw: true, lexus: true, audi: false, mercedes: false } 然后我将收到一个数组,如: allApproved(['bmw', 'audi']) // should return false allApproved(['bmw', 'lexus'
cars = {
bmw: true,
lexus: true,
audi: false,
mercedes: false
}
然后我将收到一个数组,如:
allApproved(['bmw', 'audi']) // should return false
allApproved(['bmw', 'lexus']) // should return true
如果映射中键的任何值false
,我希望函数返回false。不管有多少,如果有的是假的,我想返回false。如果它们都为真,我将返回真。使用
every()
方法测试数组中的所有元素是否通过所提供函数实现的测试
var-cars={
宝马:是的,
雷克萨斯:没错,
奥迪:错,
梅赛德斯:错
};
功能全部批准(arr){
返回arr.every(函数(el){
返回车[el];
});
}
控制台日志(所有已批准(['bmw','audi']);
console.log(allApproved(['bmw','lexus'])代码>使用
every()
方法测试数组中的所有元素是否通过所提供函数实现的测试
var-cars={
宝马:是的,
雷克萨斯:没错,
奥迪:错,
梅赛德斯:错
};
功能全部批准(arr){
返回arr.every(函数(el){
返回车[el];
});
}
控制台日志(所有已批准(['bmw','audi']);
console.log(allApproved(['bmw','lexus'])代码>
cars={
宝马:是的,
雷克萨斯:没错,
奥迪:错,
梅赛德斯:错
}
功能全部批准(arr){
return!arr.some(函数(v){return!cars[v];});
}
console.log(allApproved(['bmw','audi']);//假的
console.log(allApproved(['bmw','lexus','asd']);//正确
cars={
宝马:是的,
雷克萨斯:没错,
奥迪:错,
梅赛德斯:错
}
功能全部批准(arr){
return!arr.some(函数(v){return!cars[v];});
}
console.log(allApproved(['bmw','audi']);//假的
console.log(allApproved(['bmw','lexus','asd']);//正确
最快的仍然是一个常规的旧循环
function allApproved(arr) {
for (var i=arr.length; i--;) {
if (cars[arr[i]] === false) return false;
}
return true;
}
最快的仍然是一个常规的旧环路
function allApproved(arr) {
for (var i=arr.length; i--;) {
if (cars[arr[i]] === false) return false;
}
return true;
}
你可能应该提到each()
使用短路。使用some
和each
似乎是彼此相反的,是一种更有效的方法还是一种清洗方法?@Ben则在速度上是相同的。一个只查找false
,另一个查找true
。我会使用every
来增加语义。使用.every()
在语义上更简单。(我只是很少使用。every()
,所以我在写我的答案时自然倾向于。有些()
,但我认为这种方式“更好”。)你可能应该提到every()
使用短路。使用有些
和every
似乎是彼此相反的,“是一个效率更高,还是一次清洗?”本接着说,速度是一样的。一个只查找false
,另一个查找true
。我会使用every
来增加语义。使用.every()
在语义上更简单。(我只是很少使用。every()
,所以我在写我的答案时自然倾向于。有些()
,但我认为这种方式“更好”。)我认为数组#有些
更快,因为如果任何处理程序返回false
,它会停止迭代。。我说的对吗?@Rayon No.每个
都是这样。如果其中一个实现只是另一个实现的shell,我不会感到惊讶。我认为Array#一些会更快,因为如果任何处理程序返回false
,它会停止迭代。。我说的对吗?@Rayon No.每个
都是这样。如果其中一个实现只是另一个实现的外壳,我不会感到惊讶。绝对不要将cars
转换为数组。基于属性名使用对象进行直接查找既快又容易理解。绝对不要将cars
转换为数组。基于属性名使用对象进行直接查找既快又容易理解。当然最快,但如果arr
中的某个值在cars
中没有条目,您可能想说if(!cars[arr[i]])
而不是==false
。(假设未知品牌默认为not approved。)@nnnnnn-这是真的,另一方面,它将检查任何虚假值,而不仅仅是严格的布尔值false
?不确定OP需要什么,严格比较以避免虚假值,或使用空值进行非严格比较?这是的好处!cars[arr[i]
将是,如果任何地方都有一个null
,它也将是falsy。另外,它更短;P但这是一个好处,OP明确指出,他正在寻找带有false
作为值的键,而不是null
?绝对是最快的,但如果中的某个值在arr
中没有条目,你可能想说如果(!cars[arr[i]])
而不是==false
。(假设未知品牌默认为not approved。)@nnnnnn-这是真的,另一方面,它将检查任何虚假值,而不仅仅是严格的布尔值false
?不确定OP需要什么,严格比较以避免虚假值,或使用空值进行非严格比较?这是的好处!cars[arr[i]
将是,如果任何地方都有一个null
,它也将是falsy。另外,它更短;P但这是一个好处,OP明确指出他正在寻找的键的值是false
,而不是null
?