读【数据结构与算法】之字典

字典是一种以键-值形式存储数据的数据结构。

在JS中Object类就是以字典的形式设计的。所以在JS中实现字典是很容易的,且能够基于对象(非Object类)来封装出来字典。

字典类的基础是Array类,而不是Object类,但由于Array也是对象,所以上边所说基于对象是没错的。为什么是Array而不是Object呢,因为有好多场景需要有一个可以排序的字典,而在JS中是不能对对象的属性排序的。

基础实现:

/**
 * Class Dictionary
 * 字典 Dictionary
 */

function Dictionary() {
	this._data = []; // 用于存储数据的数组
}

Dictionary.prototype = {

	constructor: Dictionary,

	/**
	 * 添加项
	 * @param  {String} key   添加项的键
	 * @param  {Any}    value 添加项的值
	 * @return {Undefined}   undefined
	 */
	add: function add(key, value) {
		this._data[key] = value;
	},

	/**
	 * 查找键的值
	 * @param  {String} key 键
	 * @return {Any}        值
	 */
	find: function find(key) {
		return this._data[key];
	},

	/**
	 * 删除给定键的项
	 * @param  {String} key 键
	 * @return {Boolean}    是否删除成功
	 */
	remove: function remove(key) {
		return delete this._data[key];
	},

	/**
	 * 得到所有键值
	 * @return {Array} 结果数组
	 */
	showAll: function showAll() {
		var ret = [];
		for (var key in this._data) {
			if (this._data.hasOwnProperty(key)) {
				ret.push(key + ' -> ' + this._data[key]);
			}
		}
		return ret;
	},

	/**
	 * 所有项个数
	 * @return {Number} 个数值
	 */
	count: function count() {
		if (Object.keys) return Object.keys(this._data).length;
		var n = 0;
		for (var key in this._data) {
			if (this._data.hasOwnProperty(key)) {
				n++;
			}
		}
		return n;
	},

	/**
	 * 清空字典
	 * @return {Undefined} undefined
	 */
	clear: function clear() {
		for (var key in this._data) {
			if (this._data.hasOwnProperty(key)) {
				delete this._data[key];
			}
		}
	}

};

现在额外的增加对字典的排序功能。在JS中数组是可以排序的,那对于字典中按键排序输入结果的实现也是基于数组的排序的。

简单来说就是利用字典中所有的key,排序之后输入就好。

function showAll(sorted) {
	var ret = [], key, keys = [];
	if (sorted) {
		for (key in this._data) {
			if (this._data.hasOwnProperty(key)) {
				keys.push(key);
			}
		}
		keys = keys.sort();
		for (var i = 0, len = keys.length; i < len; i++) {
			ret.push(keys[i] + ' -> ' + this._data[keys[i]]);
		}
		return ret;
	}
	for (key in this._data) {
		if (this._data.hasOwnProperty(key)) {
			ret.push(key + ' -> ' + this._data[key]);
		}
	}
	return ret;
}

具体运行例子请看demojs实现字典

发布于: 2014年 09月 05日