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

Sass SCSS:检查多维列表中是否存在值,sass,Sass,我使用的是Sass(v3.3.0.alpha.392),我有一个多维列表,看起来有点像这样 $list: ( config: ( foo: ( a: 1, b: 2, ), bar: ( a: 3, b: 4, ), )); @mixin foo($arg) { @if $arg exists in $list == true { // is 'foo' or 'bar' /

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

$list: (
config: (
    foo: (
        a: 1,
        b: 2,
    ),
    bar: (
        a: 3,
        b: 4,
    ),
));
@mixin foo($arg) {
    @if $arg exists in $list == true { // is 'foo' or 'bar'
        // Do something
    } @else {
        @warn "failed.";
    }
}
我有一个@mixin,它接受一个参数,如果它存在于config$列表中,它将根据传递的参数进行输出。像这样的,

$list: (
config: (
    foo: (
        a: 1,
        b: 2,
    ),
    bar: (
        a: 3,
        b: 4,
    ),
));
@mixin foo($arg) {
    @if $arg exists in $list == true { // is 'foo' or 'bar'
        // Do something
    } @else {
        @warn "failed.";
    }
}
用法

.test {
    @include foo(bar); // should return true and run code block
    @include foo(data); // should return false and @warn
}
但是,我找不到正确的函数来检查$list中是否存在$arg。我尝试了一些检查索引的小功能

@function exists($n) {
    @return (false == index($list, config $n));
}
但是,这似乎不起作用(我可能只是用错了)。我基本上需要根据arg是否包含在$list中在不同的操作之间切换

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


谢谢

第二个问题可以使用类型,如下所示:

@if type-of($arg) == number {
    ...
}
对于第一个问题,您无法访问具有非数字索引的列表,因此助手索引($list,config$n)将中断。我不知道为什么要使用多维列表,sass并不是专门为它构建的,也没有必要。使用

@if index($list, $arg) != false {
    ...
}
那就好了,我的建议是去重构你的代码,这样它就不需要2d列表了,但是如果你必须的话,那么你必须并且必须在每个级别上迭代每个项目,以检查$arg是否存在于每个“列表中的列表”中,如果这有意义的话

所以你会得到(我的sass有点生疏,我不知道@each是否是列表上的迭代函数)


这很难看,让它以任何方式运行都将是一个问题。您试图做的是以一种不同的方式使用Sass,您试图使Sass列表的行为类似于javascript对象,它们非常不同。您应该考虑只使用新的键值,这将是您真正需要做的一切(事实上,在映射中创建一个映射作为一个值就是javascript对象,您可以这样做)

您的
$list
实际上是一个映射:

type-of($list) == map
如果我理解正确,您会对将键与值(例如,
bar
)匹配感兴趣。
有一个名为
map has key($map,$key)
的函数,如果找到匹配的键,它将返回true,但在多维映射中,它只匹配最顶层的键。但是,您可以编写一个简单的包装器函数,在映射的所有级别递归应用
map has key
,直到找到匹配项为止。包装器函数可以是这样的:

@函数rmhk($m,$a){
@如果map有键($m,$a){@returntrue;};
@每个$key,$e,单位为$m{
@if(type of($e)==map)和rmhk($e,$a){@return true;}
}
@返回false;
}
同样的方法(使用递归函数),除了键之外,还可以匹配地图中的值,或者遍历列表而不是地图(使用多维列表中的值匹配)


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

完美。我不知道为什么我认为我使用的是列表而不是地图。这就是使用v3.3的全部原因。无论如何,你和@Jeremey都帮了大忙!