根据对象映射检查数组中的任何值是否为false的最有效方法

时间:2016-07-28 21:47:53

标签: javascript optimization

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

例如我有一个像这样的对象:

cars = {
  bmw: true,
  lexus: true,
  audi: false,
  mercedes: false
}

然后我会收到一个像:

这样的数组
allApproved(['bmw', 'audi'])  // should return false
allApproved(['bmw', 'lexus']) // should return true

如果地图中的键false的任何值,我希望我的函数返回false。无论多少,如果有任何假,我想要归还假。如果他们都是真的,我会回归真实。

3 个答案:

答案 0 :(得分:2)

使用Array#every

  

every() 方法测试数组中的所有元素是否都通过了提供的函数实现的测试。

var cars = {
  bmw: true,
  lexus: true,
  audi: false,
  mercedes: false
};

function allApproved(arr) {
  return arr.every(function(el) {
    return cars[el];
  });
}

console.log(allApproved(['bmw', 'audi']));
console.log(allApproved(['bmw', 'lexus']));

答案 1 :(得分:1)



cars = {
  bmw: true,
  lexus: true,
  audi: false,
  mercedes: false
}

function allApproved(arr) {
  return !arr.some(function(v) { return !cars[v]; });
}

console.log(allApproved(['bmw', 'audi']));  // false
console.log(allApproved(['bmw', 'lexus', 'asd'])); // true




如果数组中没有.some()个元素没有相应的true值,则所有元素都会获得批准。 (注意如果cars没有特定品牌的条目,则此代码会将该品牌视为false。)

答案 2 :(得分:0)

最快的仍然是常规的旧循环

function allApproved(arr) {
    for (var i=arr.length; i--;) {
        if (cars[arr[i]] === false) return false;
    }
    return true;
}