SASS - 通过 map_merge 传递地图会导致看起来相似但不等同的地图

SASS - Passing map through map_merge results in similar looking but not equivalent map

我正在尝试编写一个函数,以动态地将一些转换应用到先前为 angular material 主题定义的颜色映射。问题是函数的结果是错误的,不知何故。

我已经通过调试日志打印了结果,它看起来与原始地图一模一样,但无法通过按键进行比较,如果我尝试将其提供给 angular material 函数,则会导致错误。

这是该问题的简化演示 - 您可以看到

我需要在函数内部完成的是 $eenie 在经过 map_merge

之后等同于 $miney

我怀疑可能是因为密钥看起来是一个数字,它存在某种数据类型危机,但我对 SASS 的了解还不够,无法弄清楚是否是这种情况或如何解决它。我试过使用引号,但这似乎不是 angular material 函数可接受的输入,所以我需要它与 $eenie 完全匹配。

@function merge-things($base-palette){
  $result: ();
  @each $hue, $color in $base-palette {
      $result: map_merge($result, (#{$hue}: $color));
  }
  @return $result;
}

$eenie: (
  50: green,
  contrast: (
    50: white,
  ),
);
$meenie: (
  50: green,
  contrast: (
    50: white,
  ),
);

$miney: merge-things($eenie);
$mo: merge-things($miney);



@debug $eenie;    // DEBUG: (50: green, contrast: (50: white))
@debug $meenie;   // DEBUG: (50: green, contrast: (50: white))
@debug $miney;    // DEBUG: (50: green, contrast: (50: white))
@debug $mo;       // DEBUG: (50: green, contrast: (50: white))
@debug 'eenie-meenie #{map-keys($eenie) == map-keys($meenie)}';   // DEBUG: eenie-meenie true
@debug 'eenie-miney #{map-keys($eenie) == map-keys($miney)}';     // DEBUG: eenie-miney false
@debug 'miney-mo #{map-keys($miney) == map-keys($mo)}';           // DEBUG: miney-mo true

merge-things 函数在使用地图中的数字键执行插值时更改键的类型。

@use "sass:map";

$result: map-merge($result, (#{$hue}: $color));

下面的练习表明插入 number 类型会将其转换为 string 类型。

@use "sass:meta";

$k: 1;

@debug meta.type-of(#{$k}); // string

@debug meta.type-of($k); // number

构建新地图时,请保持原样。

-      $result: map-merge($result, (#{$hue}: $color));
+      $result: map-merge($result, ($hue: $color));