Wpis z mikrobloga

Siemka, w js są tablice. Tablice mają użyteczne metody takie jak map, forEach, reduce, itp. Ja mam tablicę kilkudziesięcio elementową, ale indeksy są timestampami, więc wygląda to tak:
a[1458077566] = {...}, a[1458077466] = {...}, ...
Wykonanie a.forEach zabija skrypt.
Jak można w miarę normalnie użyć arrayów o tak dużych indeksach?
#programowanie #javascript
  • 18
  • Odpowiedz
@no_login: Nie używać tak dużych indeksów, to po pierwsze. Nie używać timestampów, to po drugie (taka tablica jest na pewno bardzo rzadka, a więc nie ma żadnego zysku z bycia tablicą). Po trzecie używając metody Object.keys wyciągasz z tablicy wszystkie dostępne indeksy. Iterujesz sobie po tej tablicy indeksów i masz dostęp do każdego elementu.
  • Odpowiedz
w js są tablice

użyteczne metody

map

Taaaa
['3','26','35','5','65','45','76','34'].map(parseInt)
[3, NaN, NaN, NaN, NaN, 4, NaN, 25]
( ͡° ͜ʖ ͡°)
  • Odpowiedz
@no_login: zamiast arraya użyj obiektu. pamiętaj, że obiekty to kolekcje typu klucz:wartość w której klucz jest stringiem a wartość typem dowolnym. do obiektu MOŻESZ odwołać się za pomocą operatora [] podając w nim klucz, podobnie jak w arrayu:

var a = {};
a[16342341] = 5;
a[23123131] = 9;
a[12155615] = 11;
console.log( a ); // { '16342341': 5 , '23123131': 9, '12155615': 11 };

for( var key in a ) {
  • Odpowiedz
Taaaa ['3','26','35','5','65','45','76','34'].map(parseInt)

[3, NaN, NaN, NaN, NaN, 4, NaN, 25]


@GotoFinal: powinienes uzyc Number do rzutowania stringa na integera. parseInt jest od czegos innego ale spoko mogles nie wiedziec. Podales to co moim zdaniem czyni ten jezyk wlasnie ELASTYCZNYM. Ale jesli ktos go nie zna to moze nie wiedziec co pisze...
  • Odpowiedz
@kmiasko: zauważyłem, dlatego szukam sposobu
@Marmite: @larvaexotech: Objecty nie mają tych wygodnych metod, o które mi tu chodzi, i nie trzymają kolejności indeksów

Problem rozwiązałem jakoś na około, przy użyciu Objektów i Map (bodajże), ale szukam czegoś na przyszłość.
  • Odpowiedz
@no_login: Tablice to pod spodem też są obiekty. Pytanie jest krótkie, czy naprawdę musisz indeksować po timestampach? Jeśli tak, to powinieneś używać map. Tablice powinny być używane tylko dla "sensownego" indeksowania.
  • Odpowiedz
@no_login: po prostu nie rozumiesz jak działa tablica.

obiekt to w JS kolecja typu klucz:wartość. klucz może być czymkolwiek co da się opisać stringiem. zaleta obiektów jest taka, że można trzymać w niej indeksy dowolnego typu, wada to taka że (pomińmy wszeklie optymalizacje robione wewnętrznie przez silniki JS) dostęp do indeksu takiego obiektu jest długi bo w rzeczywistości jest to hashmapa, czyli każdy klucz jest hashem a potem kolekcja jest przeszukiwana
  • Odpowiedz
@larvaexotech:
Nie będę się sprzeczał, ale js-owe tablice to raczej jakieś listy - doczytałem, chodzi o Sparse Array.
Jakby było tak jak piszesz, to a[1458077566]={}, wymagało by zaalokowania kilku gigabajtów.

Tu chyba chodzi o samą implementację forEach i podobnych funkcji, które iterują po każdym indeksie, chociaż tak naprawdę nie muszą.

Loadsh to dobry trop.
  • Odpowiedz
@Jurigag tym, że moja wersja jest poprawna, a tamta nie ( ͡° ͜ʖ ͡°)

Funkcja map przyjmuje jako pierwszy parametr funkcję, która może mieć 3 parametry: currentValue, index, array (https://developer.mozilla.org/pl/docs/Web/JavaScript/Referencje/Obiekty/Array/map). Natomiast funkcja parseInt przymuje 2 parametry: string i radix (https://developer.mozilla.org/pl/docs/Web/JavaScript/Referencje/Obiekty/parseInt). Jeżeli tym callbackiem dla map będzie funkcja parseInt to dla każdej kolejnej iteracji map w tablicy ['3','26','35','5','65','45','76','34'] sytuacja będzie wyglądać następująco:
1. iteracja: parseInt('3', 0) ===
  • Odpowiedz