ฉันกำลังอยู่ระหว่างการย้ายโค้ดบางส่วนที่ใช้ไลบรารี hashmap ไปยัง ES6 แผนที่ อย่างไรก็ตาม ฉันประสบปัญหาที่แผนที่ที่มีอยู่ของฉันถูกคีย์ด้วยอาร์เรย์ ถึงเวลาค้นหา อาร์เรย์ที่เทียบเท่าจะถูกสร้างขึ้นและใช้เป็นคีย์การค้นหา การใช้ HashMap
ถือว่าใช้ได้ เนื่องจากคีย์ที่ซับซ้อนถูกแฮชในลักษณะที่เทียบเท่ากับการเปรียบเทียบเชิงลึก ในทางกลับกัน Map
ของ ES6 จะทำการเปรียบเทียบความเท่าเทียมกันอย่างเข้มงวดบนคีย์
วิธีเก่าของฉันในการค้นหาคีย์:
var h = new HashMap();
var k = [1,2,3];
h.set(k, 'foo');
h.has([1,2,3]) // returns true
ภายใต้ ES6 วิธีการนั้นใช้ไม่ได้ผลเนื่องจากมีการเปรียบเทียบความเท่าเทียมกันอย่างเข้มงวด
var m = new Map();
var k = [1,2,3];
m.set(k, 'foo');
m.has([1,2,3]) // returns false
มีวิธีการบังคับฟังก์ชันการเปรียบเทียบที่กำหนด หรือโอเวอร์โหลด get()
ในลักษณะที่จะค้นหาคีย์ที่ซับซ้อนด้วยการเปรียบเทียบเชิงลึกแทนที่จะเป็นความเท่าเทียมกันที่เข้มงวดหรือไม่ ฉันไม่สามารถสร้างคลาสย่อย Map
ที่ทำเช่นนั้นได้หากไม่มีการค้นหาเชิงเส้นผ่านคีย์ ซึ่งทำลายประสิทธิภาพที่ได้รับจากการใช้ประเภทเนทิฟตั้งแต่แรกโดยสิ้นเชิง