แผนที่แฮช JavaScript ใช้งานอย่างไร


89

ปัจจุบันฉันทำงานกับ OpenLayers และมีชุดข้อมูลจำนวนมากเพื่อวาดลงในเลเยอร์เวกเตอร์ (มากกว่า 100,000 เวกเตอร์)

ตอนนี้ฉันกำลังพยายามใส่เวกเตอร์เหล่านี้ทั้งหมดลงในแผนที่แฮช JavaScript เพื่อวิเคราะห์ประสิทธิภาพ ฉันต้องการทราบว่ามีการใช้งานแฮชแมปใน JavaScript อย่างไรมันเป็นฟังก์ชันแฮชจริงหรือเป็นเพียงฟังก์ชันห่อหุ้มที่ใช้โครงสร้างข้อมูลอย่างง่ายและอัลกอริทึมการค้นหา


2
ไม่มีการติดตั้ง JS เพียงอย่างเดียวดังนั้นจึงไม่มีทางตอบโจทย์นี้ได้ ECMAScript ไม่ได้ระบุโครงสร้างข้อมูลที่จะใช้สำหรับอ็อบเจ็กต์และไม่ระบุข้อ จำกัด ในเวลาเข้าถึง แฮชเป็นเรื่องปกติ แต่สามารถใช้ต้นไม้ที่สมดุลได้
outis

1
ES6 มีแผนที่บริสุทธิ์ ลิงก์อธิบายความแตกต่างระหว่างวัตถุธรรมดาและแผนที่รายละเอียดที่สำคัญ ฯลฯ : MDN JavaScript Map
Den Roman

คำตอบ:


196

ทุกออบเจ็กต์ javascript เป็นแฮชแมปธรรมดาที่ยอมรับสตริงหรือSymbolเป็นคีย์ดังนั้นคุณสามารถเขียนโค้ดของคุณเป็น:

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

วัตถุ javascript เป็นแฮชแมปจริงในการนำไปใช้งานดังนั้นความซับซ้อนในการค้นหาคือ O (1) แต่ไม่มีhashcode()ฟังก์ชันเฉพาะสำหรับสตริงจาวาสคริปต์จะถูกนำไปใช้ภายในโดยโปรแกรมจาวาสคริปต์ (V8, SpiderMonkey, JScript.dll เป็นต้น .)

อัปเดตปี 2020:

วันนี้ javascript รองรับประเภทข้อมูลอื่น ๆ เช่นกัน: MapและWeakMap. พวกมันทำงานใกล้เคียงกับแผนที่แฮชมากกว่าวัตถุแบบดั้งเดิม


สมบูรณ์แบบ. ฉันใช้ $ ('div # someDiv') ข้อมูล (คีย์ค่า) มาก่อนและอันนี้ง่ายกว่ามากและอาจรองรับเบราว์เซอร์รุ่นเก่าได้ดีกว่าด้วย ขอบคุณ
Swaroop

มีวิธีหาความยาวของแผนที่ไหม
หินกลิ้ง

2
@Sridhar ใช้ Object.keys (แผนที่) .length
otakustay

1
โปรดทราบว่าคุณสามารถใช้ตัวเลขเป็นคีย์ได้map[2] = 'foo'แต่จะถูกส่งไปยังสตริงภายใน> map = { '2': 'foo' }
Harry Moreno

@otakustay นั่นเป็นคุณสมบัติที่ยอดเยี่ยมมากที่ฉันมารู้ในวันนี้ :) จริงๆฉันต้องเรียนรู้ Javascript อย่างใกล้ชิด
Pankaj Prakash

31

ไม่สามารถใช้อ็อบเจ็กต์ JavaScript บนแฮชแม็พได้อย่างหมดจด

ลองใช้สิ่งนี้ในคอนโซลเบราว์เซอร์ของคุณ:

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

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

... และคุณจะได้รับกลับมาตามลำดับการแทรกซึ่งเป็นพฤติกรรมมาตรฐานโดยพฤตินัย

แผนที่แฮชจะไม่รักษาการเรียงลำดับโดยเนื้อแท้ดังนั้นการใช้งาน JavaScript อาจใช้แผนที่แฮช แต่ถ้าเป็นเช่นนั้นจะต้องมีดัชนีแยกต่างหากเป็นอย่างน้อยและการจัดเก็บหนังสือเพิ่มเติมสำหรับการแทรก

ที่นี่วิดีโอของลาร์สบัคอธิบายว่าทำไม v8 ไม่ได้ใช้กัญชาแผนที่จะใช้วัตถุ


3
"otakustay ผิดทางเทคนิคผิดประเภทที่เลวร้ายที่สุด" ที่รุนแรงเล็กน้อย อาจไม่ใช่ 1: 1 แต่สำหรับเจตนาและจุดประสงค์ของการใช้แฮชเหมือนพจนานุกรมมันทำงานในรูปแบบเดียวกัน
อาจขึ้น

1
เพียงต้องการชี้แจงว่านี่อาจเป็นความจริงของการใช้งาน JavaScript บางอย่าง (เช่นเบราว์เซอร์ส่วนใหญ่) แต่ไม่จำเป็นต้องเป็นจริงเสมอไป ลำดับของการย้ำคีย์ไม่ได้กำหนดโดยมาตรฐาน ECMAScript และอาจเป็นคำสั่งใดก็ได้และยังคงเป็นการใช้งาน JS ที่ถูกต้อง
TheZ

19

นี่เป็นวิธีที่ง่ายและสะดวกในการใช้สิ่งที่คล้ายกับแผนที่ Java :

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
    }

และเพื่อรับค่า:

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

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

13

คุณควรลองคลาสนี้ไหม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"

หมายเหตุ: คีย์และค่าสามารถเป็นประเภทใดก็ได้

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


4

แม้ว่าออบเจ็กต์ JavaScript แบบเก่าธรรมดาสามารถใช้เป็นแผนที่ได้ แต่โดยปกติแล้วจะถูกนำไปใช้เพื่อรักษาลำดับการแทรกเพื่อให้เข้ากันได้กับเบราว์เซอร์ส่วนใหญ่ (ดูคำตอบของ Craig Barnes) และไม่ใช่แผนที่แฮชแบบง่ายๆ

ES6 แนะนำแผนที่ที่เหมาะสม (ดูMDN JavaScript Map ) ซึ่งมาตรฐานระบุว่า :

ต้องใช้วัตถุแผนที่โดยใช้ตารางแฮชหรือกลไกอื่น ๆ ที่โดยเฉลี่ยแล้วให้เวลาในการเข้าถึงที่เป็นเส้นย่อยกับจำนวนองค์ประกอบในคอลเล็กชัน



0

ฉันพบปัญหาที่ฉันมี json พร้อมคีย์ทั่วไป ฉันต้องการจัดกลุ่มค่าทั้งหมดที่มีคีย์เดียวกัน หลังจากท่องเว็บฉันพบแพ็คเกจแฮชแมปป ซึ่งเป็นประโยชน์จริงๆ

multi(key:*, value:*, key2:*, value2:*, ...)ไปยังกลุ่มองค์ประกอบด้วยคีย์เดียวกันผมใช้

แพ็คเกจนี้ค่อนข้างคล้ายกับคอลเลกชัน Java Hashmap แต่ไม่ทรงพลังเท่า Java Hashmap

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.