背景
「配列を受け取って、1つでも値が設定されていればtrueを返す」
という、
幾度となく書いてきた簡単な関数をjQueryで書いてみたところ、ハマった。
自己解決できたので、備忘録とQiita更新するクセをつけるために書いておく。
TL;DR
↑毎回TL;DRって書きたいがために更新してる
PHPと同じノリで、配列をeach()で回し、条件に当てはまったらreturn ture;
して即抜けする、という書き方をしていたら、うまくいかなかった。
うまくいかない事象としては、
trueのルートに入っているのに、関数呼び出し側で待っているとfalseが返ってくる。
/**
* 配列を受け取り、1つでも値が入っていればtrueを返す
* 間違い版
*/
"SampleArrayCheck": function(targetArray) {
$.each(targetArray, function(index, answer){
if(answer){
return true;
}
});
return false;
},
稚拙な考えながら、
returnしてるけど毎回のfunctionを抜けているだけで、eachは抜けていないのでは?
と思った。(以下)
/**
* 配列を受け取り、1つでも値が入っていればtrueを返す
* 間違い版(自己解説)
*/
"SampleArrayCheck": function(targetArray) {
$.each(targetArray, function(index, answer){
if(answer){
// ここでeachを抜け出すように書いていたけど、
// functionを抜けただけで、eachは引き続き回っているのでは
return true;
}
});
// 何度trueを返そうと最後に必ずここに来るのでfalseが返る
return false;
},
上記の仮設のもと、
とりあえずすぐ思いつく、変数に格納する形に変えた。
(以下)
/**
* 配列を受け取り、1つでも値が入っていればtrueを返す
* 修正版
*/
"SampleArrayCheck": function(targetArray) {
// 関数のスコープ内でステータス管理の変数を用意する
let result = false;
$.each(targetArray,function(index, answer){
if(answer){
// trueを代入するだけにする
result = true;
}
});
// trueでもfalseでもここで返る
return result;
},
上手くいった。
時間があったらちゃんと調べるけど今のところあっているぽいので今日はここまで。
指摘だらけだとは思いますが
何かあればコメントいただけますと幸いですmm