2013-02-28 15 views
47

Zastanawiam się, czy można uzyskać indeks elementu dla pętli @each.@ pętla z indeksem

Mam następujący kod, ale zastanawiałem się, czy zmienna $i była najlepszym sposobem, aby to zrobić.

Aktualny kod:

$i: 0; 
$refcolors: #55A46A, #9BD385, #D9EA79, #E4EE77, #F2E975, #F2D368, #F0AB55, #ED7943, #EA4E38, #E80D19; 

@each $c in $refcolors { 
    $i: $i + 1; 
    #cr-#{$i} strong { 
     background:$c; 
    } 
} 

Odpowiedz

70

Przede wszystkim funkcja @each nie jest z Kompas, ale od Sass.


Aby odpowiedzieć na to pytanie, nie można tego zrobić z każdej pętli, ale to jest łatwe do konwersji na @for pętli, która może to zrobić:

@for $i from 1 through length($refcolors) { 
    $c: nth($refcolors, $i); 

    // ... do something fancy with $c 
} 
+0

słodkie. Dzięki: D – ignacioricci

+9

imho, używając 'each', sass autorzy powinni automatycznie utworzyć zmienną' $ idx', która będzie używana jako indeks. to jest bardzo przydatne. – vsync

40

Aby zaktualizować tę odpowiedź: Tak można to osiągnąć z pętli @each:

$colors-list: #111 #222 #333 #444 #555; 

@each $current-color in $colors-list { 
    $i: index($colors-list, $current-color); 
    .stuff-#{$i} { 
     color: $current-color; 
    } 
} 

Źródło: http://12devs.co.uk/articles/handy-advanced-sass/

+11

Niestety to podejście ulega złamaniu, jeśli lista $ colors zawiera 2 identyczne wartości (np. # 111, # 222, # 111, # 333). W tym przypadku indeks ($ colors-list, # 111) zawsze zwróci 1, więc twoje wartości $ i wyjdą jako 1, 2, 1, 4. Wstyd, ponieważ w przeciwnym razie jest to bardzo zgrabne podejście :) – Joel

+1

To jest również 1 -indeksowany zamiast wspólnego 0-index –

4

Czasami może zajść potrzeba użycia tablicy lub mapy. Miałem tablicy tablic, a mianowicie:

$list = (('sub1item1', 'sub1item2'), ('sub2item1', 'sub2item2')); 

Okazało się, że to było najłatwiej po prostu przekonwertować go do obiektu:

$list: (
    'name': 'thao', 
    'age': 25, 
    'gender': 'f' 
); 

i użyć następującej dostać $i:

@each $property, $value in $list { 
    $i: index(($list), ($property $value)); 

Zespół sass również polecił następujące rzeczy, chociaż nie jestem fanem:

[...] Powyższy kod jest tym, w jaki sposób chciałbym rozwiązać ten problem. Można go zwiększyć dzięki dodaniu funkcji Sass, takiej jak zakres ($ n). Tak więc ten zakres (10) => (1, 2, 3, 4, 5, 6, 7, 8, 9, 10). Następnie wyliczyć można stać:

@function enumerate($list-or-map) { 
    @return zip($list-or-map, range(length($list-or-map)); 
} 

link.