2016-07-28 3 views
0

私はブール値が1つのキーを持つオブジェクトを扱っています。私は、配列から受け取った値が、関連付けられたキーを持つオブジェクトでfalseであるかどうかをチェックする最も効率的な方法を見つけようとしています。例えば配列からの値がオブジェクトマップに基づいてfalseかどうかを確認する最も効率的な方法

私はそうのような物を持っている:

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

その後、私はのような配列を受け取ります:マップ内のキー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その後、速度は同じです。 1つは 'false'を探し、もう1つは' 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

すべてが承認され、対応するtrue値を持っていない配列の.some()要素が存在しない場合。 (carsは、特定のブランドのエントリがない場合、このコードはfalseように、そのブランドを扱うことに留意。)

+0

' Array#some'いずれかのハンドラが 'false'を返すと、反復処理が停止するため、処理が速くなります。 – Rayon

+1

@レイヨン「every」もそうです。実装の1つがもう一方のシェルの単なるものであれば、私は驚くことはありません。 – 4castle

0

最速はまだ確かに変換しない

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

間違いなく最も速いですが、 'arr'の値の1つに' cars 'という項目がない場合には、 'if(!cars [arr [i]])'ではなく '=== false' '。 (未知のブランドはデフォルトでは承認されないと仮定します) – nnnnnn

+0

@nnnnnn - これは真実ですが、厳密なブール値 'false'だけでなく偽の値もチェックします。 OPが必要とするもの、偽の値を避けるための厳密な比較、または空の値で動作する非厳密な比較を確認できませんか? – adeneo

+0

'!cars [arr [i]]の利点は、どこにも' null 'があれば、それも偽であるということです。プラス、それは短いです; P – 4castle

関連する問題