📜  SASS中的排序函数

📅  最后修改于: 2021-08-29 12:30:27             🧑  作者: Mango

任何排序函数的主要函数是比较两个字符串并检查两个字符串的哪一个必须在另一个之前。几乎每种编程语言都有一些内置的排序函数,但要在 Sass 中执行此操作,您需要创建自己的字符串比较函数。在第一步中,我们需要教 Sass,根据每个字符串包含的字符对字符串进行排序的正确顺序。我们使用一个变量来做到这一点。

$sort-order: a b c d e f g h i j k l m n o p 
             q r s t u v w x y z !default;

这将用于声明以a开头的字符串应该出现在以b 或 c开头的字符串之前,依此类推。您还可以添加其他值,如数字、大写字母或符号。
现在,您将需要一个比较函数。在比较函数,我们基本上遍历每个字符串的字符,并在 Sass index()函数的帮助下在排序顺序列表中查找它们的顺序。它将为我们提供两个可以比较的值,其中一个在另一个之前。如果值相同,我们循环下一组字符,依此类推。
如果 $string-a 在 $string-b 之前,则str-compare()函数返回 true,否则返回 false。

@function compare($string-a, $string-b, $sort-order) {
  $string-a: to-lower-case($string-a + unquote(""));
  $string-b: to-lower-case($string-b + unquote(""));      
  
  @for $i from 1 through min(
          str-length($string-a), str-length($string-b)) {
  
    $char-a: str-slice($string-a, $i, $i);
    $char-b: str-slice($string-b, $i, $i);
      
    @if $char-a and $char-b and index(
           $order, $char-a) != index($sort-order, $char-b) {
      @return index(
           $sort-order, $char-a) < index($sort-order, $char-b);
    }
  }
    
  @return str-length($string-a) < str-length($string-b);
}

在这里,我们将使用冒泡排序算法进行排序,因为它是最基本和最简单的方法。由于冒泡排序基于交换数组或列表中的两个值,我们还需要在 Sass 中使用swap()函数。
swap()函数将接受一个列表和两个索引值作为输入。需要在列表中交换索引值。
我们将使用set-nth()函数,因为它只是更新列表而不是创建新列表。

@function swap($list, $index-a, $index-b) {
  @if abs($index-a) > length($list) or
               abs($index-b) > length($list) {
    @return $list;
  }
  $temp: nth($list, $index-a);
  $list: set-nth($list, $index-a, nth($list, $index-b));
  $list: set-nth($list, $index-b, $temp);
  @return $list;
}

现在,我们有一个compare()函数和一个swap()函数,这意味着我们已经准备好创建我们的sort()函数了。该函数简单地遍历列表,将项目相互比较并在比较后交换它们,直到列表完全排序。

@function sort($list, $sort-order) {
  @for $i from 1 through length($list) {
  @for $j from $i * -1 through -1 {
      $j: abs($j);
      @if $j > 1 and compare(nth($list, $j),
                  nth($list, $j - 1), $sort-order) {
        $list: swap($list, $j, $j - 1);
      }
    }
  }
  @return $list;
}

最后,我们需要传递字符串值并返回 sort()函数。

$list: internships placements classes geeksforgeeks courses;
$sort: sort($list);

输出:

classes courses geeksforgeeks internships placements