Το Sass δεν παρέχει ενσωματωμένο τρόπο ταξινόμησης μιας λίστας τιμών. Χάρη στις λειτουργίες χειρισμού συμβολοσειρών, μπορούμε να δημιουργήσουμε μια συνάρτηση για να ταξινομήσουμε μια λίστα αντικειμένων μετά από μια δεδομένη παραγγελία.
Εάν οι τιμές που πρόκειται να ταξινομηθούν είναι αριθμοί και αριθμοί μόνο, καταλήγει να είναι αρκετά εύκολο επειδή ο Sass μπορεί να τις συγκρίνει εγγενώς.
Ταξινόμηση αριθμών
/// 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; )
Ταξινόμηση αριθμών και συμβολοσειρών
Ωστόσο, αν σκοπεύετε να ταξινομήσετε συμβολοσειρές καθώς και αριθμούς, αυτό συνεπάγεται αρκετή πολυπλοκότητα, οπότε ας το κάνουμε ένα βήμα τη φορά.
Πρώτον, χρειαζόμαστε μια σειρά ταξινόμησης.
/// 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;
Στη συνέχεια, χρειαζόμαστε μια συνάρτηση βοηθού για να προσδιορίσουμε ποια τιμή έρχεται πρώτη.
/// 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); )
Τελευταίο, αλλά όχι λιγότερο σημαντικό, μπορούμε να δημιουργήσουμε τη λειτουργία ταξινόμησης. Η πιο αποτελεσματική εφαρμογή (που μπορεί να μεταφερθεί στο Sass) είναι ο αλγόριθμος γρήγορης ταξινόμησης.
/// 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; )
Εάν ενδιαφέρεστε για τη δημιουργία μιας τέτοιας λειτουργίας, ρίξτε μια ματιά στον αλγόριθμο Implementing Bubble Sort με το Sass στο The Sass Way.