Kiedy tworzę nową tablicę JavaScript i używam liczby całkowitej jako klucza, każdy element tej tablicy aż do liczby całkowitej jest tworzony jako niezdefiniowany.
Na przykład:
var test = new Array();
test[2300] = 'Some string';
console.log(test);
zwróci 2298 niezdefiniowanych i jeden „jakiś ciąg”.
Jak sprawić, by JavaScript używał 2300 jako ciągu znaków zamiast liczby całkowitej lub jak zapobiec tworzeniu wystąpienia 2299 pustych indeksów?
javascript
associative-array
Peter Mortensen
źródło
źródło
0.25
i.25
rozwiąż ten sam ciąg"0.25"
. Więc jeśli używasz klawiszy ułamkowych, można odzyskać własność numerycznie ustawionego klucza0.25
za pomocą0.25
,.25
,"0.25"
ale nie".25"
.Możesz po prostu użyć obiektu:
źródło
Jak mówią ludzie, JavaScript zamieni ciąg liczbowy na liczbę całkowitą, więc nie jest możliwe użycie bezpośrednio na tablicy asocjacyjnej, ale obiekty będą działać dla ciebie w podobny sposób, jak myślę.
Możesz stworzyć swój obiekt:
I dodaj wartości tak, jak działa tablica:
To da ci:
Następnie możesz uzyskać do niego dostęp jak do tablicy w innych językach, uzyskując klucz:
Testowałem i działa.
źródło
Jeśli przypadek użycia przechowuje dane w kolekcji, wówczas ECMAScript 6 podaje
Map
typ.Inicjalizacja jest tylko trudniejsza.
Oto przykład:
Wynik:
źródło
Kompilowanie innych odpowiedzi:
Obiekt
Gdy używasz liczby jako klucza nowej właściwości, liczba zamienia się w ciąg:
Podczas uzyskiwania dostępu do wartości właściwości przy użyciu tej samej liczby, liczba jest ponownie przekształcana w ciąg:
Jednak podczas pobierania kluczy z obiektu nie zostaną one zamienione z powrotem w liczby:
Mapa
ECMAScript 6 umożliwia wykorzystanie obiektu Map ( dokumentacja , porównanie z Object ). Jeśli Twój kod ma być interpretowany lokalnie lub tabela zgodności ECMAScript 6 wygląda na wystarczająco zieloną do Twoich celów, rozważ użycie mapy:
Żadna konwersja typu nie jest wykonywana, na lepsze i na gorsze:
źródło
Użyj obiektu zamiast tablicy. Tablice w JavaScript nie są tablicami asocjacyjnymi. Są to obiekty z magią związaną z dowolnymi właściwościami, których nazwy wyglądają jak liczby całkowite. Ta magia nie jest tym, czego chcesz, jeśli nie używasz ich jako tradycyjnej struktury przypominającej tablicę.
źródło
Spróbuj użyć obiektu, a nie tablicy:
źródło
var a = []; a[Math.pow(2, 30)] = 'hello';
i nie zobaczysz, że użycie przeglądarki / pamięci wzrośnie o ponad gigabajt, ale zobaczysza.length
1073741824. Maszyny wirtualne wyraźnie przechowują niektóre „tablice” przy użyciu innej struktury danych, zgaduję, że po prostu hashtable, przynajmniej jeśli są wystarczająco nieliczne.Uzyskaj wartość dla właściwości tablicy asocjacyjnej, gdy nazwa właściwości jest liczbą całkowitą:
Zaczynając od tablicy asocjacyjnej, w której nazwy właściwości są liczbami całkowitymi:
Wypchnij elementy do tablicy:
Przejdź przez tablicę i zrób coś z wartością właściwości.
Wynik konsoli powinien wyglądać następująco:
Jak widać, można obejść ograniczenie tablicy asocjacyjnej i mieć nazwę właściwości będącą liczbą całkowitą.
UWAGA: Tablica asocjacyjna w moim przykładzie to zawartość JSON, którą miałbyś, gdybyś serializował obiekt Dictionary <string, string> [].
źródło
Użyj obiektu - z liczbą całkowitą jako kluczem - zamiast tablicy.
źródło
Czasami używam prefiksów dla moich kluczy. Na przykład:
Teraz nie masz żadnego problemu z uzyskaniem do nich dostępu.
źródło