2016-07-28 90 views
0

我正在處理具有一個布爾值的鍵的對象。我試圖找出最有效的方法來檢查從數組中獲得的任何值是否與對象關聯的鍵在對象中相等。最有效的方法來檢查基於對象映射的數組中的任何值是否爲假

例如我有一個像對象,以便:

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

然後,我將接收到類似的數組:

allApproved(['bmw', 'audi']) // should return false 
allApproved(['bmw', 'lexus']) // should return true 

如果任何值的在映射中的關鍵false,我希望我的函數返回false。無論多少,如果有的話都是假的,我想返回假。如果他們都是真的,我會回報真實的。

+0

絕對不轉換'汽車'的陣列。基於屬性名稱使用對象進行直接查找既快速又容易理解。 – nnnnnn

回答

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

你應該提到'every()'使用短路。 – 4castle

+0

使用「一些」和「每一個」似乎是彼此倒置,是更有效率還是他們洗? – Ben

+0

@Ben然後速度相同。一個只查找'false',另一個查找'true'。我會用'every'來更加語義化。 – 4castle

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。)

+0

我想'Array#some'更快,因爲如果任何處理程序返回'false',它會停止迭代。我是對嗎? – Rayon

+1

@Rayon號''每個'都這樣做。如果其中一個實現只是另一個的外殼,我不會感到驚訝。 – 4castle

0

最快的仍然是一個普通的舊環

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

肯定是最快的,但是如果(arr [i]])而不是'=== false',你可能想要說'arr'中的一個值在'cars中沒有條目'。 (假設未知品牌默認爲未批准。) – nnnnnn

+0

@nnnnnn - 這是真的,另一方面,它會檢查任何falsy值,而不僅僅是嚴格的布爾型「false」?不確定OP需要什麼,嚴格比較以避免falsy值,或者使用非空值的非嚴格比較? – adeneo

+0

'!汽車[arr [i]]'的好處是,如果在任何地方出現'null',它也會是虛假的。另外,它更短; P – 4castle

相關問題