Javascript 基于对象映射检查数组中的任何值是否为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'

我正在处理一个具有一个布尔值的键的对象。我试图找到一种最有效的方法来检查我从一个数组中接收到的任何值是否在具有相关键的对象中等于false

例如,我有这样一个对象:

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