JavaScript karma haritası nasıl uygulanır?


89

Şu anda OpenLayers ile çalışıyorum ve bir vektör katmanına (100.000'den fazla vektör) çizmek için çok sayıda veriye sahibim.

Şimdi, performansı analiz etmek için tüm bu vektörleri bir JavaScript karma haritasına koymaya çalışıyorum. JavaScript'te hash haritasının nasıl uygulandığını bilmek istiyorum, bu gerçek bir hash işlevi mi yoksa basit bir veri yapısı ve bir arama algoritması kullanan sarmalanmış bir işlev mi?


2
Sadece bir JS uygulaması yok, bu yüzden buna cevap vermenin bir yolu yok. ECMAScript, nesneler için hangi veri yapısının kullanılacağını belirtmez ve erişim süresiyle ilgili kısıtlamaları belirtmez. Kırpma tipiktir, ancak dengeli ağaçlar kullanılabilir.
outis

1
ES6, saf Haritalara sahiptir. Bağlantı, düz nesne ile Harita arasındaki farklılıkları, temel ayrıntıları vb. Açıklar
Den Roman

Yanıtlar:


196

her javascript nesnesi , bir dizeyi veya Sembolü anahtarı olarak kabul eden basit bir karma haritadır , böylece kodunuzu şu şekilde yazabilirsiniz:

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

javascript nesnesi, uygulamasında gerçek bir karma haritadır, bu nedenle aramadaki karmaşıklık O (1) 'dir, ancak hashcode()javascript dizeleri için özel bir işlev yoktur , dahili olarak javascript motoru (V8, SpiderMonkey, JScript.dll, vb.) tarafından uygulanır. .)

2020 Güncellemesi:

javascript bugün diğer veri türlerini de desteklemektedir: Mapve WeakMap. Geleneksel nesnelere göre karma haritalar olarak daha yakın davranırlar.


Mükemmel. Daha önce $ ['div # someDiv']. Data (anahtar, değer) kullanıyordum ve bu çok daha basit ve muhtemelen eski tarayıcılar için de daha iyi desteğe sahip. Teşekkürler
Swaroop

haritanın uzunluğunu bulmanın bir yolu var mı?
yuvarlanan taş

2
@Sridhar kullanın Object.keys (harita) .length
otakustay

1
Bir sayıyı anahtar olarak kullanabileceğinizi, map[2] = 'foo'ancak dahili olarak bir dizeye dönüştürüleceğini unutmayın> map = { '2': 'foo' }
Harry Moreno

@otakustay bugün tanıdığım süper harika bir özellikti :) Gerçekten Javascript'i yakından öğrenmem gerekiyor.
Pankaj Prakash

31

JavaScript nesneleri, yalnızca karma haritaların üzerine uygulanamaz.

Bunu tarayıcı konsolunuzda deneyin:

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

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

... ve bunları fiilen standart davranış olan ekleme sırasına göre geri alacaksınız .

Karma haritalar doğası gereği sıralamayı korumaz, bu nedenle JavaScript uygulamaları bir şekilde karma eşlemeler kullanabilir , ancak kullanırlarsa , en azından ayrı bir dizin ve eklemeler için fazladan kitap tutma gerektirir.

İşte, Lars Bak'ın v8'in nesneleri uygulamak için neden karma haritalar kullanmadığını açıklayan bir videosu .


3
"otakustay teknik olarak yanlıştır, en kötü türden yanlıştır." Bu biraz sert. 1: 1 olmayabilir, ancak bir karma sözlük gibi bir hash kullanmanın amacı ve amaçları için aynı şekilde çalışır.
muhtemelen

1
Bunun bazı JavaScript uygulamaları için (çoğu tarayıcı gibi) doğru olabileceğini, ancak her zaman doğru olmadığını açıklığa kavuşturmak istiyorum. Anahtarlar üzerinden yineleme sırası, ECMAScript standartları tarafından tanımlanmamıştır ve herhangi bir sıra olabilir ve yine de geçerli bir JS uygulaması olabilir.
TheZ

19

İşte Java'ya benzer bir şey kullanmanın kolay ve kullanışlı bir yolu haritasına :

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
    }

Ve değeri elde etmek için:

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

......  etc  .....

13

Bu dersi denemelisiniz 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"

Uyarı: anahtar ve değer herhangi bir tür olabilir.

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


4

Düz eski JavaScript nesneleri harita olarak kullanılabilirken, bunlar genellikle çoğu tarayıcıyla uyumluluk için ekleme sırasını koruyacak şekilde uygulanır (Craig Barnes'ın cevabına bakın) ve bu nedenle basit karma haritalar değildir.

ES6 , standardın söylediği uygun Haritaları (bkz. MDN JavaScript Haritası ) sunar :

Harita nesnesi, ortalama olarak koleksiyondaki öğelerin sayısına göre alt doğrusal olan erişim süreleri sağlayan karma tablolar veya diğer mekanizmalar kullanılarak uygulanmalıdır.


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>

0

Bazı ortak anahtarlara sahip json'umun olduğu problemle karşılaşıyordum. Aynı anahtara sahip tüm değerleri gruplamak istedim. Biraz sörf yaptıktan sonra hashmap paketi buldum . Bu gerçekten yardımcı oldu.

Öğeyi aynı anahtarla gruplamak için kullandım multi(key:*, value:*, key2:*, value2:*, ...).

Bu paket biraz Java Hashmap koleksiyonuna benzer, ancak Java Hashmap kadar güçlü değildir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.