2014-06-22 21 views
7

Czy istnieje pętla w Lodash dla tablic asocjacyjnych? Funkcja o nazwie "forEach", którą znalazłem, działa tylko w przypadku tablic indeksowanych. Na przykład, jeśli mam tablicę myArray z wartościami [1, 2, 3] i zrobićLodash forEach Asocjacyjna tablica

i uruchomić funkcję (w Node), uzyskać oczekiwany wynik:

1 
2 
3 

Jednak, gdy próbuję to z tablicy asocjacyjnej, to nie działa:

lodash = require('lodash'); 
myArray = []; 
myArray['valOne'] = 1; 
myArray['valTwo'] = 2; 
myArray['valThree'] = 3; 
lodash.forEach(myArray, function(index) { 
    console.log('7'); 
}); 

Jak widać z tego działa w Node, callback funkcja d nie strzela, nawet jeśli zawiera coś innego niż elementy tablicy. Wygląda na to, że całkowicie pominięto pętlę.

Po pierwsze, dlaczego tak się dzieje? Po drugie, czy istnieje inna funkcja zawarta w Lodash dla tego problemu, lub, jeśli nie, czy istnieje sposób użycia funkcji forEach, aby to osiągnąć, bez zmiany oryginalnej tablicy w procesie?

Odpowiedz

5

Lodash ma w tym celu funkcję forOwn. W drugiej tablicy, jeśli chcesz uzyskać oczekiwany wynik, musisz wykonać następujące czynności.

Nadal nie jestem pewien, dlaczego forEach wydaje się pomijać pierwszą funkcję, ale uważam, że może to mieć związek z tym, że tablica nie ma "długości". Długość tablicy JavaScript jest najwyższym indeksem, jaki ma. Na przykład tablica myOtherArray określona jako myOtherArray[999]="myValue" będzie mieć długość 1000 (ponieważ tablice są indeksowane od zera, co oznacza, że ​​zaczynają się od 0, a nie od 1), nawet jeśli nie mają innych wartości. Oznacza to, że tablica bez indeksów numerowanych lub tylko indeksy negatywne nie będą miały atrybutu length. Lodash musi przechwycić to i nie nadawać macierzowi atrybutu length, prawdopodobnie zachować spójność i wydajność, nie renderując żadnych wyników.

6
myArray = []; 
myArray['valOne'] = 1; 
myArray['valTwo'] = 2; 
myArray['valThree'] = 3; 
lodash.forEach(myArray, function(index) { 
    console.log('7'); 
}); 

Tablica asocjacyjna to po prostu zestaw par wartości klucza, który jest niczym innym niż obiektem JavaScript. Powyżej przypadku - myArray.length === 0, Po prostu dodajesz właściwości do obiektu tablicy, nie dodając żadnych wartości do rzeczywistej tablicy.

Zamiast zainicjować myArray takiego i pętli przy użyciu forIn

var myArray = {}; 
myArray['valOne'] = 1; 
myArray['valTwo'] = 2; 
myArray['valThree'] = 3; 

lodash.forIn(myArray, function(value, key) { 
    console.log(key + " : " + value); 
}); 

lub po prostu

var myArray = { 
    valOne : 1, 
    valTwo : 2, 
    valThree : 3 
    }; 

    lodash.forIn(myArray, function(value, key) { 
     console.log(key + " : " + value); 
    }); 

więcej o przedmiot jako asocjacyjna here