接下來進入正題,先用一個比較簡單的例子,一次介紹$slice
(選取特定範圍的陣列資料) 、$reverseArray
(將陣列反轉)、$indexOfArray
(查詢資料在陣列的位置)三種操作符。
假設現在有一筆英文成績的資料
對它執行以下指令
其中$slice的指令有兩種寫法,一種是直接指定切割的範圍,{ $slice: [ <array>, <position>, <n> ] }
,透過<position>
選擇要從陣列哪一個位置開始切割,搭配<n>
決定要選取幾個資料出來。
或是直接寫{ $slice: [ <array>, <n> ] }
,透過<n>
是正數或負數,決定要從陣列的開頭或結尾選出n筆資料。
另外$indexOfArray除了用{ $indexOfArray: [ <array expression>, <search expression> ] }
這種比較簡單的寫法外,後面還可以再多待兩個參數,決定要搜尋範圍,例如:{ $indexOfArray: ["$english", 100, 1, 4] }
,這時候會從陣列1~4的位置看有沒有100這個值,如果剛好找不到資料,會回傳-1。
再來如果我們想要快速建立陣列資料,可以透過$range
這個操作符,後面會帶入一個陣列,第一個參數決定回傳新陣列的開頭數值,第二個參數決定結尾的數值,第三個參數決定要新陣列每一個元素的數值間隔。
詳細範例如下
最後來介紹$reduce
,它可以幫助我們快速使用陣列的每一筆資料,進行運算。
假設數學老師一道題目,要求學生計算1到10連加以及連乘的結果,這時候我們可以用以下指令計算。
讓我們用計算連加的過程,來詳細說明上方程式碼是如何運行。
一開始我們有設定初始值是{ sum: 0, multiply: 1 },因此第一次在下方in
計算的時候,$$value.sum
的值會是0,這時會取出陣列第一個元素1,會用$$this
做代表。
因為我們有寫{ $add: [“$$value.sum”, “$$this”] },所以0+1=1,在下一輪時$$value.sum
的值就會變成1,在與第二個陣列元素2做相加,接下來的就一直延續以上步驟,直到把整個陣列都遍歷過一次,最後回傳計算結果。