2012年4月5日 星期四

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]);   // <--- 不合理的點!! 會印出20

在最後一行,就是奇怪的地方了, 你的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才行!





1 則留言:

  1. 也可以試試 form2js 這個 plugin @ https://github.com/maxatwork/form2js

    回覆刪除

Related Posts Plugin for WordPress, Blogger...