2012-01-16 12 views
55

Obecnie pracuję z OpenLayers i mam ogromny zestaw danych do narysowania warstwy wektorowej (większej niż 100000 wektorów).W jaki sposób jest zaimplementowana mapa skrótów JavaScript?

Teraz próbuję umieścić wszystkie te wektory w mapie skrótów JavaScript, aby przeanalizować wydajność. Chcę wiedzieć, w jaki sposób jest zaimplementowana mapa skrótu w JavaScript, czy jest to prawdziwa funkcja skrótu, czy tylko funkcja zawijana, która wykorzystuje prostą strukturę danych i algorytm wyszukiwania?

+1

Nie tylko jedna realizacja JS, więc nie ma sposobu, aby odpowiedzieć na to pytanie. ECMAScript nie określa, jakiej struktury danych użyć dla obiektów, ani nie określa ograniczeń czasu dostępu. Hashe są typowe, ale można zastosować zrównoważone drzewa. – outis

Odpowiedz

136

każdy javascript obiekt jest prosta HashMap który przyjmuje tylko ciąg znaków jako klucza, więc można napisać kod jako:

var map = {}; 
// add a item 
map[key1] = value1; 
// or remove it 
delete map[key1]; 
// or determine whether a key exists 
key1 in map; 

javascript obiekt jest prawdziwym HashMap na jego realizację, więc złożoność w wyszukiwarce to O (1), ale nie ma dedykowanej funkcji hashcode() dla łańcuchów javascript, jest ona wewnętrznie zaimplementowana przez mechanizm javascript (V8, SpiderMonkey, JScript.dll, itp.)

Jednak obecnie javascript nie obsługuje innych datatype oprócz łańcucha jako klucza, ECMAv6 (harmonia) wprowadziłaby klasę WeakMap, która akceptuje y obiekt jako klucz, ale byłoby to bardzo dawno ...

+0

Idealny. Używałem $ ("div # someDiv"). Data (key, value) wcześniej, a ten jest znacznie prostszy i prawdopodobnie ma lepsze wsparcie dla starszych przeglądarek. Dzięki – Swaroop

+0

jest sposób na znalezienie długości mapy? – Sridhar

+2

@Sridhar use Object.keys (map) .length – otakustay

18

Oto prosty i wygodny sposób używając coś podobnego do Java map:

var map= { 
    'map_name_1': map_value_1, 
    'map_name_2': map_value_2, 
    'map_name_3': map_value_3, 
    'map_name_4': map_value_4 
    } 

i uzyskać wartość:

alert(map['map_name_1']); // fives the value of map_value_1 

...... etc ..... 
29

Obiekty JavaScript nie mogą być implementowane wyłącznie na mapach skrótów.

Spróbuj w konsoli przeglądarki:

var foo = { 
    a: true, 
    b: true, 
    z: true, 
    c: true 
} 

for (var i in foo) { 
    console.log(i); 
} 

... a będziesz otrzymywać je w kolejności wstawiania, który jest de facto standard zachowanie.

Mapy skrótów z natury nie utrzymują porządku, więc implementacje JavaScript mogą w pewnym sensie korzystać z map hashowych, ale jeśli tak się stanie, będzie to wymagało co najmniej osobnego indeksu i kilku dodatkowych księgowań dla wstawień.

Oto wideo z Lars Bak explaining why v8 doesn't use hash maps to implement objects.

+2

" Otakustay jest technicznie niewłaściwy, najgorszy rodzaj błędu. " To trochę trudne. Może nie być 1: 1, ale dla celów i celów używania skrótu, takiego jak słownik, działa on w ten sam sposób. – probablyup

+0

Punkt targowy. Moderowałem to nieco. –

+1

Chcę tylko wyjaśnić, że może tak być w przypadku niektórych implementacji JavaScript (takich jak większość przeglądarek), ale niekoniecznie zawsze prawdziwe. Kolejność iteracji kluczy nie jest zdefiniowana przez standardy ECMAScript i może być dowolną kolejnością i nadal być prawidłową implementacją JS. – TheZ

1
<html> 
<head> 
<script type="text/javascript"> 
function test(){ 
var map= {'m1': 12,'m2': 13,'m3': 14,'m4': 15} 
    alert(map['m3']); 
} 
</script> 
</head> 
<body> 
<input type="button" value="click" onclick="test()"/> 
</body> 
</html> 
3

ES6 ma czyste mapy. Łącze opisuje różnice pomiędzy zwykłym przedmiotem i mapą, kluczowe dane etc:

MDN JavaScript Map

1

Podczas Plain Old obiekty JavaScript mogą być używane jak mapy, są one zazwyczaj realizowane w sposób zapewniający zachowanie wstawiania zamówienie kompatybilność z większością przeglądarki (patrz odpowiedź Craiga Barnesa), a zatem nie są to proste mapy skrótów.

ES6 wprowadza odpowiednie mapy (patrz MDN JavaScript Map) których standard says: obiekt

Mapa muszą być realizowane z wykorzystaniem zarówno tabel mieszania lub innych mechanizmów, które średnio zapewniają czasy dostępu, które są sublinear od liczby elementy w kolekcji.

0

należy spróbować tej klasy Map:

var myMap = new Map(); 
 

 
// setting the values 
 
myMap.set("1", 'value1'); 
 
myMap.set("2", 'value2'); 
 
myMap.set("3", 'value3'); 
 

 
myMap.size; // 3 
 

 
// getting the values 
 
myMap.get("1"); // "value associated with "value1" 
 
myMap.get("2");  // "value associated with "value1" 
 
myMap.get("3");  // "value associated with "value3"

Wskazówka: klucz i wartość może być dowolnego typu.

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map

Powiązane problemy