EX: 配列に含まれる数が全て0 <= N <= 255
かどうか調べたい
次のデータから条件にマッチする配列だけを取り出す。
// 調べる配列の入ったデータ var data = [ [ 217, 0, 0, 0 ], [ 169, 254, 0, 1 ], [ 0, 0, 0, 256 ], [ 1, 0, -1, 255 ], [ '', 0, 0, 0 ] ];
forEach
だとループの途中でbreakできないっぽい。
なので条件に合わないものがあっても最後までチェックするので無駄があり。
for break
条件に合わない値が出てきたらbreak
でループを抜ける方法
var a = []; d.forEach(function(arr, i) { let isOK = true; for(let j=0,l=arr.length; j<l; j+=1) { let n = arr[j]; if( typeof(n) !== 'number' || (n < 0 || n > 255) ) { isOK = false; break; } } if(isOK) { a[a.length] = arr; } }); console.log(a); // => [ [ 217, 0, 0, 0 ], [ 169, 254, 0, 1 ] ]
Array.prototype.every (ES5)
allPassed = array.every(callback[, thisObject]);与えられた関数によって実行されるテストに配列のすべての要素が合格するかどうかをテストします。
出典: [https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/every:title]
callback
が1つでもfalse
を返した時点でループから抜ける
d.forEach(function(arr, i) { let callback = function(i) { return (typeof(i) === 'number' && (i >= 0 && i <= 255) ); // 条件に合わないの否定でもOK // return !(typeof(i) !== 'number' || (i < 0 || i > 255) ); }; if( arr.every(callback) ) { a[a.length] = arr; } }); console.log(a); // => [ [ 217, 0, 0, 0 ], [ 169, 254, 0, 1 ] ]
Array.prototype.some (ES5)
array.some(callback[, thisObject]);与えられた関数によって実行されるテストに合格する要素が配列の中にあるかどうかをテストします。
出典: [https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/some:title]
callback
が1つでもtrue
を返した時点でループから抜ける
d.forEach(function(arr, i) { let callback = function(i) { // NGな条件式を返せばOK return (typeof(i) !== 'number' || (i < 0 || i > 255) ); }; // NGに全くマッチしなければ(falseなら)、全ての値が条件を満たしている if( !arr.some(callback) ) { a[a.length] = arr; } }); console.log(a); // => [ [ 217, 0, 0, 0 ], [ 169, 254, 0, 1 ] ]
👆日本語で説明を書くと余計混乱しそう...
感想とまとめ
関数 | ループから抜ける条件 |
---|---|
for | break キーワードが出てきた段階 |
every | callback関数がfalse を返した段階 |
some | callback関数がtrue を返した段階 |
every
, some
を使えばシンプルに書けて良さそう。(条件式返すのがちょっと気持ち悪い気もするけど多分慣れの問題。
タイトルの意味合い的にはevery
だけど、条件式の書きやすさではsome
を使ったほうが良い場合もありそう。
少しづづES5から覚えていきたい...
[参考]
- Array.prototype.forEach() - JavaScript | MDN
- JavaScript Array every() Method
- JavaScript Array some() Method
- ES2015(ES6)な時代だからこそ、ES5を改めて調べたJavaScript初級者のメモ - Qiita
- [JavaScript] ループ途中で抜ける処理は for(in break) ではなく some を使おう♪ - Qiita

- 作者: Nicholas C. Zakas,和田祐一郎
- 出版社/メーカー: オライリージャパン
- 発売日: 2014/06/18
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (4件) を見る