SCSS:检查多维列表中是否存在值

eze*_*ekg 3 sass

我正在使用 Sass (v3.3.0.alpha.392),我有一个多维列表,看起来有点像这样,

$list: (
config: (
    foo: (
        a: 1,
        b: 2,
    ),
    bar: (
        a: 3,
        b: 4,
    ),
));
Run Code Online (Sandbox Code Playgroud)

我有一个@mixin,它接受一个参数,如果它存在于配置 $list 中,将根据传递的参数进行输出。像这样的东西,

@mixin foo($arg) {
    @if $arg exists in $list == true { // is 'foo' or 'bar'
        // Do something
    } @else {
        @warn "failed.";
    }
}
Run Code Online (Sandbox Code Playgroud)

用法,

.test {
    @include foo(bar); // should return true and run code block
    @include foo(data); // should return false and @warn
}
Run Code Online (Sandbox Code Playgroud)

但是,我找不到正确的函数来检查 $arg 是否存在于 $list 中。我尝试过检查索引的小函数,

@function exists($n) {
    @return (false == index($list, config $n));
}
Run Code Online (Sandbox Code Playgroud)

但是,这似乎不起作用(我可能只是使用不当)。我基本上需要这个来根据 arg 是否包含在 $list 中来在不同的操作之间切换。

另外,可能是一个双重问题,但是还有什么方法可以检查 $arg 是整数还是字符串?也会很有帮助。

谢谢!

Mar*_*jak 5

$list实际上是一张地图:

type-of($list) == map
Run Code Online (Sandbox Code Playgroud)

如果我理解正确,您有兴趣将您的键与值匹配(例如bar)。
有一个被调用的函数map-has-key($map, $key),如果找到匹配的键,则返回 true,但在多维映射中,它只匹配最顶层的键。但是,您可以编写一个简单的包装函数,该函数递归地应用于map-has-key地图的所有级别,直到找到匹配项。包装函数可能是这样的:

type-of($list) == map
Run Code Online (Sandbox Code Playgroud)

演示

以同样的方式(使用递归函数),除了键之外,您还可以匹配映射中的值,或者遍历列表而不是映射(DEMO与多维列表中的值匹配)。

而且,正如@Jeremy 已经指出的那样,您可以使用type-of()来检查变量的类型(例如string, number, list, map, color),但是如果由于某种原因需要检查更具体的内容,则需要一个自定义函数(例如例如,这个用于检查值是否为整数的简短函数:DEMO)。