「同じ要素が連続である」配列の判定を行いたくていろいろ試行錯誤したので、ここにメモ。
let array = [12, 2, 0, 0, 0, 5];
↑の配列のような場合だと、「0が3回連続である」配列だからtrue
を返す、というような処理を書きたい
試したこと①:filterメソッドでできるかいったん確認
let target_array = [0, 0, 0];
let array = [12, 2, 0, 0, 0, 5];
const result = array.filter(item => item === target_array);
console.log(result);
// 実行結果
// []
「0が3回連続で続く配列」と同じ要素を取り出そうとしてfilter
メソッドで試したが、配列の要素に配列を当てはめようとしているのでもちろんできない。
試したこと②:配列の重複を利用
2つの配列を比較して重複を取り出すことにしようってなった。
(参考記事)
https://www.dkrk-blog.net/javascript/duplicate_an_array
let target_array = [0, 0, 0];
let array = [12, 2, 0, 0, 0, 5];
const result = array.filter(item => target_array.includes(item)).length === 3
console.log(result);
// 実行結果
// true
target_array
の中のarray
と一致する要素を取得、その個数が3つあるならtrue
を返す。
「これでtrue
になった!!」って思っていたけど、いろいろ配列を変えてみると思い通りの判定にならず。。。。
これは「target_array
の要素の中でarray
の要素と一致するものは3個かどうか」っていう処理だから、目的の処理ではないって現実を突きつけられる。。。
そもそも、配列の重複で確認できるは「配列の要素」だけで、「配列の順番」は同時に確認できないだろって自分でツッコミしてました。
ポイントにした点
配列の重複を確認しているときに、「配列に同じ要素が並んでいる」という考え方ではなく「配列の要素が連続して同じ」っていう視点に切り替えることにした。
端的に言えば、「配列の同じ要素のインデックス番号に取得してそれが連続しているかどうか」っていう処理を書こうってなった。
強引にインデックス番号を取得:findIndex
対象の要素のインデックス番号を取得するのは、findIndex
メソッドだからそれを使用することにした。
ここで問題になってくるのが、findIndex
メソッドは最初のインデックス番号しか取得できないってことだが、これについては強引に突破することにした。
let array = [12, 2, 0, 0, 0, 5];
let first_zero = parent.findIndex(element => element === 0);
if (first_zero !== -1) {
delete array[first_zero];
}
console.log(array);
let second_zero = parent.findIndex(element => element === 0);
if (second_zero !== -1) {
delete array[second_zero];
}
console.log(array);
let third_zero = parent.findIndex(element => element === 0);
if (first_zero !== -1 && second_zero !== -1) {
array[first_zero] = 0;
array[second_zero] = 0;
}
console.log(array);
console.log(first_zero);
console.log(second_zero);
console.log(third_zero);
let first_condition = first_zero + 1 === second_zero
let second_condition = second_zero + 1 === third_zero
if (first_condition && second_condition) {
console.log('成功');
} else {
console.log('失敗');
}
// 実行結果
// [12, 2, , 0, 0, 5]
// [12, 2, 0, , 0, 5]
// [12, 2, 0, 0, 0, 5]
// 2
// 3
// 4
// 成功
「最初のインデックス番号しか取れないなら、取得する度に要素を空にしよう」という考えでdelete
演算子を使用。
空のまま放置はさすがにまずいから、third_zero
を取得したタイミングで0
を戻す処理も一緒に添える。
ここで取得してきたインデックス番号が連番していたら、「成功」が呼び出される仕組み。
まとめ
これで一応目的の処理が問題なくできたけど、綺麗なコードではないから別の通りを考えないといけないなと思いつつある程度に煮詰まったからここにアウトプットしました。
もっと最適な処理がある場合は、コメントで教えていただけると幸いです。
最後まで読んでくれてありがとうございました。