Non String Key for Associative Array in JavaScript

What is Associative Array

javascript 的 associative array 就是C++ 的unordered_map, Python的dictionary。
Associative array 存取方便,效率高,Lua這個小巧的語言更是只提供了 associative array 來當作基本資料結構而沒有提供佔連續記憶体空間的 array.

Associative Array in JavaScript

javascript 的 associative array 只要用以下的方式就可以使用了:
var mapping = { name : "tim" };
console.log( mapping['name'] );    // tim
console.log( mapping.name );      // tim

Key is Simple String

javascript 的 associative array 簡單易用,但是他只能以字串當作key。
請看以下的程式:
var o1 = new Object();
var o2 = new Object();
o1.name = 'tim';
o2.name = 'eve';
var mapping = {};
mapping[o1] = 10;
mapping[o2] = 20;
console.log(mapping[o1]);   //

在最後一行,就是奇怪的地方了, 你的key失去作用了。不管你用o1還是o2當作key, 你得到的數值都是20。
原因是javascript 不知道這怎麼把o1, o2變成 String. 所以一慮會把o1,o2 轉成 “Object”這個字串來當作mapping的key。

用toString來讓 Object 可以成為Associative Array的Key值

那我如何把這些Object 放進 associative array裡呢? 我們要為Object 提供 toString方法。
[o1,o2].forEach( function(d){ d.toString = function(){return this.name;}; } )

上面的程式,this的觀念覺得很不順嗎? 請參考這一篇文章 JavaScript的this,你有搞懂過嗎?
。 幫這幾個Object 加上 toString 的方法之後,就可以把Object 放進 associative array裡面了。
mapping[o1] = 10;
mapping[o2] = 20;
console.log(mapping[o1])  // 10
console.log(mapping[o2])  // 20
上面都是簡單的示意,想要讓程式更精鍊一點的話,建構物件時,你需要搭配javascript的 prototype才行!


Comments
  1. 回覆

Leave a Reply

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *