CODE-用Javascript模仿.NET Dictionary功能
| | 8 | | 13,930 |
跟同事討論到如何在Javascript裡實做類似Hashtable或Dictionary的功能。
早期Javascript總被我當成毒蛇猛獸,遇到複雜一點的需求總習慣找別人寫好的Library(例如這個)上場頂著,只想在Javascript裡繼續用熟悉的方式應付過去就算了,甚少花時間去研究這威力強大但千變萬化到有點複雜的語言。直到玩了一陣子jQuery,對Javascript稍微有深一點點(也只有一點點)的了解,遇到類似需求,開始試著用Javascript語法實現,不再每次為了一點小事拉一個Library進來。
剛好接連幾次被人問到類似問題: 怎樣列舉Javascript物件的所有屬性? 如何用Javascript模擬Dictionary保存資料? 看來是上天在暗示我這是個.NET開發人員的Javascript FAQ,提醒我該把這個簡單實用,但常常不知如何下手的小題目整理出範例 -- 如何在Javascript裡模擬出相當於.NET Dictionary<string, string>的效果?
以下範例用對照的方式,分別以C#及Javascript實現Dictionary<string, string>進行加入元素、取得元素筆數、檢查鍵值(Key)是否存在、移除元素、列舉所有元素(其實就是列舉Javascript物件的全部屬性)等操作,希望.NET老手們在闖蕩Javascript世界時可以再少一分茫然...
(Javascript高手們如知道更好的寫法,也請不吝指正)
<%@ Page Language="C#" %>
<script runat="server">
void Page_Load(object sender, EventArgs e)
{
StringBuilder sb = new StringBuilder();
Dictionary<string, string> dct = new Dictionary<string, string>();
//加入元素
dct.Add("P1", "V1");
dct.Add("P2", "V2");
dct.Add("P3", "V3");
//取得筆數
sb.AppendFormat("Count={0} ", dct.Count);
//檢查Key值是否存在
sb.AppendFormat("Exists('P1')={0} ", dct.ContainsKey("P1"));
sb.AppendFormat("Exists('P4')={0} ", dct.ContainsKey("P4"));
//移除元素
dct.Remove("P1");
//列舉所有元素
sb.AppendFormat(
"Data=({0})",
string.Join(", ",
dct.Select(
kv =>
string.Format("{0}=>{1}", kv.Key, kv.Value))
.ToArray()));
lblDisp.Text = sb.ToString();
}
</script>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
<script src="http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.5.1.js"
type="text/javascript"></script>
<script type="text/javascript">
$(function () {
var sb = [];
var dct = {};
//加入元素
dct["P1"] = "V1";
dct["P2"] = "V2";
dct["P3"] = "V3";
//取得筆數
var c = 0;
for (var p in dct) c++;
sb.push("Count=" + c);
//檢查Key值是否存在(in比d[..]!=undefined精準)
sb.push("Exists('P1')=" + ("P1" in dct));
sb.push("Exists('P4')=" + ("P4" in dct));
//移除元素
delete dct["P1"];
//列舉所有元素
sb.push("Data=(");
for (var p in dct)
sb.push(p + "=>" + dct[p]);
sb.push(")");
alert(sb.join("\n"));
});
</script>
</head>
<body>
<form id="form1" runat="server">
<asp:Label ID="lblDisp" runat="server"></asp:Label>
</form>
</body>
</html>
執行結果:
C#
Count=3 Exists('P1')=True Exists('P4')=False Data=(P2=>V2, P3=>V3)
Javascript
Count=3
Exists('P1')=true
Exists('P4')=false
Data=(
P2=>V2
P3=>V3
)
Comments
# by Jerry Lai
sb.push("Count=" + dct.length);
# by hectorlee369
http://www.isstudy.com/ajaxjc/3367.html 這個也不錯用.
# by Jeffrey
to Jerry Lai, dct是{ }(物件),而不是[](陣列),若未指定dct["length"],我想dct.length應該會是undefined才對。
# by player
jquery-1.5.1.js ? 不是都 1.6.1 了嗎? 詳見 http://jquery.com/ 或 http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.6.1.js 關於JavaScript下的StringBuilder http://www.player.idv.tw/prog/index.php/StringBuilder.js
# by Jeffrey
to player, 1.5.1是因為ASP.NET MVC專案模版預設的版本,我只順勢改用CDN以便大家可以複製後直接執行,版本部分就沒調(其實這個範例jQuery根本沒派上用場)。JS版StringBuilder是好東西,謝謝分享。
# by Jerry Lai
一時不察, sorry 不過如果是物件, 在 delete 之後, Count就沒有意義了
# by Dean
一直就不太懂这些Java语言,有个朋友推荐我去看看这个web http://www.keepautomation.com/products/java_barcode/ 说是能帮助我理解, 我看了后更迷惑了。绕晕了
# by Misa
I think .net is easy than Java http://www.keepautomation.com/products/net_barcode_aspnet/barcodes/ean_128.html