配列でsplitもどき(JavaScriptメモ)
JavaScriptに関するメモです。配列(Array)を適当な部分で分割したかったのでsplit
もどきの関数を書きました。文字列のsplit
をちゃんと配列版にしたわけではないので「もどき」と言っています。
function split(array, separator) { return array.reduce(function(p, n, i) { if (n !== separator) { p[p.length - 1].push(n); } else { if (i !== 0 && i !== array.length - 1 && array[i - 1] !== separator) p.push([]); } return p; }, [[]]) }
// 's'で分割する split(['a', 'b', 's', 'c', 'd', 's', 'e'], 's') => [ ["a", "b"], ["c", "d"], ["e"] ] // 配列の最初と最後に区切り文字があるときは、空配列を作らずに無視する // 連続している区切り文字も1つとみなし、空配列は作らない split([1,2,3,3,3,3,3,4,5,4,3,2,2,1,1,2,3,3,4,1], 1); => [ [2, 3, 3, 3, 3, 3, 4, 5, 4, 3, 2, 2], [2, 3, 3, 4] ] // 区切り文字が配列に含まれていないときは、配列そのものを要素に持った配列を返す split([1,2,3,3,3,3,3,4,5,4,3,2,2,1,1,2,3,3,4,1], 0) => [[1, 2, 3, 3, 3, 3, 3, 4, 5, 4, 3, 2, 2, 1, 1, 2, 3, 3, 4, 1]]
感想
必要に駆られて書いてみたので、文字列のsplit
の配列版にはなっていないです。スプレッドシートがExcel方眼紙状態になっていて、そこからデータを取得しなきゃいけない、というときに使用しました。
配列版split
を作る場合、配列を区切り文字にして配列を分割できるようにするのが自然だと思います。文字列のsplit
をうまく使って配列版をかけないか?と思ったのですが、空文字とかの扱いが微妙です。
なんか圏論とか使うと整理できそうな気がしました。文字列対象から配列対象への射を、配列関手で写した先みたいな。全然よくわかっていないです。圏論ということはHaskellでの実装を見ると面白いかもしれないです。(多分split
的なものがある?)