點燈坊

失くすものさえない今が強くなるチャンスよ

使用 where() 實現 filter()

Sam Xiao's Avatar 2024-06-02

Go 並沒有內建 filter(),但 Hugo 則提供 where() 類似 filter() 功能。

Version

Hugo 0.126.2

Template

<!doctype html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    {{ $title := "Hugo Lab" }}
    <title>{{ $title }}</title>
    <link rel="stylesheet" href="style.css" />
  </head>
  <body>
    <!doctype html>
    <html lang="en">
      <body>
        {{ $companies := slice
          (dict "name" "apple")
          (dict "name" "google")
          (dict "name" "microsoft")
        }}
        {{ $companies = where $companies "name" "eq" "apple" | first 1 }}
        <ul>
          {{ range $companies }}
            <li>{{ .name }}</li>
          {{ end }}
        </ul>
      </body>
    </html>
  </body>
</html>

Line 14

{{ $companies := slice
  (dict "name" "apple")
  (dict "name" "google")
  (dict "name" "microsoft")
}}
  • slice():定義 $companies slice
  • dict():定義 map

Line 19

{{ $companies = where $companies "name" "eq" "apple" | first 1 }}
  • where():類似 JavaScript 的 filter()
    • 第一個參數:傳入 Collection 名稱
    • 第二個參數:傳入 function 名稱,必須以 String 形式傳入,而非 function
    • 第三個參數:比較條件
  • where() 會回傳所有符合條件的 slice,可在 pipe first 1 取得第一筆資料

Line 20

<ul>
  {{ range $companies }}
    <li>{{ .name }}</li>
  {{ end }}
</ul>
  • range():列舉 slice

Conclusion

  • where() 因為必須搭配 key,因此只能使用於 Slice of Map, 而不能用於 Slice of Scalar,

Reference

Hugo, collections.Where