Scss рекурсивная функция для всех комбинаций в списке с целевой длиной - PullRequest
0 голосов
/ 04 октября 2019

Может ли кто-нибудь превратить эту функцию в рекурсивную общую функцию, чтобы я мог использовать ее для получения комбинаций для n количества размеров?

Это то, что у меня есть в настоящее время, и оно работает только до $size: 2

@function combinations($list, $size, $separator: comma){
  $result: null;

  @each $item in $list {

    @if ($size == 1) {

      $result: append($result, #{$item}, $separator);
    } @else {

      @each $val in $list {

        $result: join($result, #{$item}#{$val}, $separator);
      }
    }
  }

  @return $result;
}


$list: a, b, c;

test {
  val: combinations($list, 2);
}

Выход на размер: 1

a, b, c

Выход на размер: 2

a, b, c, aa, ab, ac, ba, bb, bc, ca, cb, cc

Но мне нужно это, чтобы продолжить с $size: n и n <= length($list)

1 Ответ

1 голос
/ 05 октября 2019

После нескольких попыток и большого количества исследований я, наконец, нашел решение.

@function combinations($list, $size: length($list), $combs: (), $separator: comma){

  @if ($combs == ()) {
    $combs: $list;
  }

  @if ($size == 1) {

    @return $combs
  }

  $newCombs: null;

  @each $comb in $combs {
    @each $item in $list {
      @if not index($newCombs, $comb) {
        $newCombs: join($newCombs, #{$comb}#{$item}, $separator);
      }
    }
  }

  @return join($combs, #{combinations($list, abs($size - 1), $newCombs)});
}

$list: a, b, c;
$size: n;

combinations($list, $size); выведет список всех возможных комбинаций значений в $list на основе $size.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...