徵求意見稿:巢狀 Map 函式

由 Natalie Weizenbaum 發佈於 2020 年 9 月 16 日

隨著 Sass 函式庫和設計系統變得越來越複雜,並且有更多具有不同需求的使用者,它們往往需要共享和覆蓋配置和設計 token。這種配置通常是階層式的,最終會被表示為包含 map 的 map,而這些 map 又包含更多的 map。到目前為止,Sass 的 map 函式還不容易處理這種巢狀 map 結構。但隨著 Sass 核心團隊成員 Miriam Suzanne 撰寫的最新語言提案,情況正在發生變化。

此提案擴展了現有的 map 函式,並添加了一些新函式,使處理巢狀 map 比以前容易得多。它基於網路上各種 Sass 專案中出現的輔助函式,將最佳實務整合回語言本身。

函式函式永久連結

以下是此提案新增的及改進的函式

map.get()map.has-key()map.get() 和 map.has-key() 永久連結

map.get()map.has-key() 函式現在都可以接受任意數量的鍵作為參數。每個鍵都會深入到巢狀 map 中,讓您可以輕鬆檢查巢狀值,而無需將一堆函式呼叫串在一起。

例如,讓我們以下列簡化的配置 map 為例

$config: (
  "colors": (
    "primary": red,
    "secondary": blue
  )
)

對於此 map,map.get($config, "colors", "primary") 會取得 "colors" 鍵的值 (("primary": red)),然後取得 "primary" 鍵的值,並返回 red

同樣地,map.has-key($config, "colors", "primary") 會返回 true,而 map.has-key($config, "colors", "tertiary") 會返回 false

map.merge()map.merge() 永久連結

map.merge() 函式現在可以作為 map.merge($map1, $keys..., $map2) 呼叫。這會將 $map2$map1 位於鍵所指定位置的子項合併,並同時更新父 map。

例如,使用上面定義的配置 map,map.merge($config, "colors", ("primary": green)) 將返回

(
  "colors": (
    "primary": green,
    "secondary": blue
  )
)

map.set()map.set() 永久連結

map.set($map, $keys..., $value) 函式是全新的。雖然使用 map.merge() 更新 map 中的個別值一直是可行的,但我們發現使用者會對缺少專用的 set() 函式感到困惑。此函式不僅填補了這個角色,還可以在巢狀 map 中設定值。

您可以透過只傳遞一個鍵,將 map.set() 用於普通的單層 map。例如,map.set(("wide": 200px, "narrow": 70px), "wide", 180px) 將返回 ("wide": 180px, "narrow": 70px)

但您也可以將其用於巢狀 map。例如,map.set($config, "colors", "tertiary", yellow) 將返回

(
  "colors": (
    "primary": red,
    "secondary": blue,
    "tertiary": yellow
  )
)

map.deep-remove()map.deep-remove() 永久連結

由於現有的 map.remove() 函式已經可以接受任意數量的參數,我們無法直接更新它來處理巢狀映射。因此,我們選擇新增一個專門用於巢狀映射的新函式,稱為 map.deep-remove($map, $keys...)。這個函式會移除列表中最後一個鍵的值,並相應地更新所有父層映射。

例如,map.deep-remove($config, "colors", "secondary") 會回傳 ("colors": ("primary": red))

map.deep-merge()map.deep-merge() 永久連結

最後一個新函式可能是最令人興奮的。map.deep-merge($map1, $map2) 的運作方式與 map.merge() 相同,不同之處在於任何巢狀映射也會被合併,包括這些映射中的映射,依此類推。這使得合併兩個具有相同結構的設定映射變得容易,而無需手動合併每一層。

例如,map.deep-merge($config, ("colors": ("secondary": teal))) 會回傳

(
  "colors": (
    "primary": red,
    "secondary": teal
  )
)

讓我們知道您的想法!讓我們知道您的想法!永久連結

如果您有興趣進一步了解此提案,請在 GitHub 上完整閱讀。它將在接下來的一個月內開放評論和修訂,因此如果您希望看到一些更改,請提交 issue,我們可以討論。