意见征集:嵌套 Map 函数

2020年9月16日发布,作者:Natalie Weizenbaum

随着 Sass 库和设计系统变得越来越复杂,并且拥有更多具有不同需求的用户,它们往往需要共享和覆盖配置和设计令牌。此配置通常是分层的,最终表示为包含更多 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 使用 map.set()。例如,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 兼容。相反,我们选择为嵌套 Map 添加一个新函数,称为 map.deep-remove($map, $keys...)。此函数删除列表中最后一个键处的值,并相应地更新所有父级 Map。

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

map.deep-merge()map.deep-merge() 永久链接

最后一个新函数可能是最令人兴奋的。map.deep-merge($map1, $map2) 的工作原理与 map.merge() 相同,只不过任何嵌套 Map 也将被合并,包括这些 Map 中的 Map 等等。这使得轻松组合两个具有相同结构的配置 Map 成为可能,而无需手动合并每个级别。

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

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

请告诉我们您的想法!请告诉我们您的想法!永久链接

如果您有兴趣了解更多关于此提案的信息,请在 GitHub 上 完整阅读。它将在未来一个月内开放评论和修订,因此如果您希望看到某些更改,请 提交问题,我们可以一起讨论!