Notion Formula 2.0には繰り返し処理はない
JSでいうところのfor文やwhile文などはNotion Formulaにはふくまれていない。
では繰り返し処理はどうすればよいのか、という内容。
基本形:繰り返し用のリストを作る
Notion Formulaにはfor文やwhile文などはないが、リストに対してmap()
などで各要素に対して処理を行うことができる。
そこでリストさえ用意できれば、繰り返し処理ができることになる。
count, 100,
list, "x".repeat(count).split("").map( /* 任意の処理 */),
このようにしてrepeat()とsplit()を組み合わせることで特定回数繰り返し処理をするための空のリストをつくることができる。元の"x"の文字列は完全に無視してしまうのがポイント。
/* 繰り返し処理のために0から10の数列を作る */
count, 10,
list, "x".repeat(count).split("").map(index),
map()内でindex
を使うことでいろいろ応用ができる。
応用:繰り返し処理+条件判定するには?
事前に繰り返す回数が分かっているときは回数分の要素数のリストを作ればよいが、
問題は何回繰り返せばよいのかわからない場合。
while(cond){/*...*/}
や for(var i = 0;i<count;i++){if(cond)break;}
のように途中で条件判定して抜ける、などをやりたい場合。
Notion Formulaでは無限ループは作れない。
なので条件を満たすまでずっと処理を続ける、は困難。
ただし、100とか1000とか多めに繰り返し回数を確保しておき、
それぞれの要素一つ一つに判定をかける、は可能。
list, [ /*...*/ ],
/* 最初に条件を満たす、ならこれでOK */
index, list.findIndex(cond),
/* 各要素それぞれで判定する */
tested, list.map(current == cond ? true : false),
もっと応用:条件を満たす要素の数を数えるには
let count = 0;
for(let i=0; i < length; i++){
if(cond) count++;
if(count > 10) break;
}
Notion Formulaは変数の宣言はできるが、再代入はできない。
そのためカウンター変数的な、ループの外側に置かれる変数みたいなことができない。
前回と同様にtrue/falseのリストを作る。
/* 元のリスト */
list, [ /*...*/ ],
/* それぞれの要素を判定 */
tested, list.map(current == cond ? true : false),
各要素に対してリストからその要素までのtrueの数をmap()とslice()とfilter()を組み合わせて数える。
これがカウンター変数の代わりになる。
countedList, tested.map(
tested.slice(0, index).filter(current == true).length()
),
あとはこの数えたリストに対してfindIndex()することで、
最初のリストでどの要素が条件を満たすのかがわかる。
これはJSなどでカウンター変数が条件を満たしたときの繰り返し処理と同様のことができる。
/* 条件を10回満たした要素のindexを求める */
index, coundedList.findIndex(current > 10),
/* 元の条件を10回満たした要素 */
target, list.at(index),
最初に用意したリストの数の分だけ処理が走るので、やや非効率だが、
繰り返し処理の途中抜けなどができないので、ある程度は仕方ない。