意见征集:嵌套 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 上 完整阅读。它将在未来一个月内开放评论和修订,因此如果您希望看到某些更改,请 提交问题,我们可以一起讨论!