Sass SCSS:检查多维列表中是否存在值
我使用的是Sass(v3.3.0.alpha.392),我有一个多维列表,看起来有点像这样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' /
$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都帮了大忙!