Sortierfunktion - CSS-Tricks

Anonim

Sass bietet keine integrierte Möglichkeit zum Sortieren einer Werteliste. Dank der Funktionen zur Manipulation von Zeichenfolgen können wir eine Funktion zum Sortieren einer Liste von Elementen in einer bestimmten Reihenfolge erstellen.

Wenn zu sortierende Werte nur Zahlen und Zahlen sind, ist dies recht einfach, da Sass sie nativ vergleichen kann.

Nummern sortieren

/// Quick sort /// @author Sam Richards /// @param (List) $list - list to sort /// @return (List) @function quick-sort($list) ( $less: (); $equal: (); $large: (); @if length($list) > 1 ( $seed: nth($list, ceil(length($list) / 2)); @each $item in $list ( @if ($item == $seed) ( $equal: append($equal, $item); ) @else if ($item $SEED) ( $large: append($large, $item); ) ) @return join(join(quick-sort($less, $order), $equal), quick-sort($large, $order)); ) @return $list; )

Zahlen und Zeichenfolgen sortieren

Wenn Sie jedoch sowohl Zeichenfolgen als auch Zahlen sortieren möchten, ist dies mit einer gewissen Komplexität verbunden. Lassen Sie es uns also Schritt für Schritt tun.

Zuerst brauchen wir eine Sortierreihenfolge.

/// Default order used to determine which string comes first /// @type List $default-order: "!" "#" "$" "%" "&" "'" "(" ")" "*" "+" "," "-" "." "/" "(" "\" ")" "^" "_" "(" "|" ")" "~" "0" "1" "2" "3" "4" "5" "6" "7" "8" "9" "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;

Dann brauchen wir eine Hilfsfunktion, um zu bestimmen, welcher Wert zuerst kommt.

/// Compares two string to determine which comes first /// @access private /// @param (String) $a - first string /// @parem (String) $b - second string /// @param (List) $order - order to deal with /// @return (Bool) @function _str-compare($a, $b, $order) ( @if type-of($a) == "number" and type-of($b) == "number" ( @return $a < $b; ) $a: to-lower-case($a + unquote("")); $b: to-lower-case($b + unquote("")); @for $i from 1 through min(str-length($a), str-length($b)) ( $char-a: str-slice($a, $i, $i); $char-b: str-slice($b, $i, $i); @if $char-a and $char-b and index($order, $char-a) != index($order, $char-b) ( @return index($order, $char-a) < index($order, $char-b); ) ) @return str-length($a) < str-length($b); )

Zu guter Letzt können wir unsere Sortierfunktion aufbauen. Die effizienteste Implementierung (die auf Sass portiert werden kann) ist der schnelle Sortieralgorithmus.

/// Quick sort /// @author Hugo Giraudel /// @param (List) $list - list to sort /// @param (List) $order ($default-order) - order to use for sorting /// @return (List) /// @require (function) _str-compare /// @require $default-order @function quick-sort($list, $order: $default-order) ( $less: (); $equal: (); $large: (); @if length($list) > 1 ( $seed: nth($list, ceil(length($list) / 2)); @each $item in $list ( @if $item == $seed ( $equal: append($equal, $item, list-separator($list)); ) @else if _str-compare($item, $seed, $order) ( $less: append($less, $item, list-separator($list)); ) @else if not _str-compare($item, $seed, $order) ( $large: append($large, $item, list-separator($list)); ) ) @return join(join(quick-sort($less, $order), $equal), quick-sort($large, $order)); ) @return $list; )

Wenn Sie an der Erstellung einer solchen Funktion interessiert sind, lesen Sie den Abschnitt Implementieren des Blasensortierungsalgorithmus mit Sass bei The Sass Way.