数据结构-字典

字典是一种以 - 对形式存储结构的数据结构, 就像电话号码薄里的名字和电话号码同样. 要找一个电话时, 先找名字, 名字找到了, 紧挨着它的电话号码也就找到了. 这里的 是指你用来查找的东西, 是查找获得的结果.
JSObject类就是以字典形式设计的. 本章将使用 Object类自己的特性, 实现一个 Dictionary类, 让这种字典类型的对象使用起来更加简单. 你也能够只使用数组和对象来实现本章展现的方法, 可是定义一个 Dictionary类更方便, 也更有意思. 好比, 使用 ()引用键就比使用 []简单. 固然, 还有其余一些便利, 好比能够定义对总体进行操做的方法, 举个栗子, 显示字典中全部的元素, 这样就没必要在主程序中循环去遍历字典了.

Dictionary

Dictionary类是基础是Array类, 而不是Object类. 本章稍后将提到, 咱们想对字典中的键排序, 而JS中是不能对对象的属性进行排序的. 可是也不要忘记, JS中一切皆对象, 数组也是对象.数组

window.log = console.log.bind(console)

class Dictionary {
    constructor() {
        this._datastore = [];
    }
    add(key, value) {
        this._datastore[key] = value;
    }
    find(key) {
        return this._datastore[key];
    }
    remove(key) {
        delete this._datastore[key];
    }
    showAll() {
        Object.keys(this._datastore).forEach(key => {
            log(`${key}  ===>>>   ${this._datastore[key]}`)
        })
    }
};

const pbook = new Dictionary();
pbook.add('做家1', '书1');
pbook.add('做家2', '书2');
pbook.add('做家3', '书3');
pbook.add('做家4', '书4');
pbook.showAll();
log('</br>')
pbook.remove('做家3');
pbook.showAll();

add()方法接受两个参数: 键和值. 键是值在字典中索引.
find()方法以键为参数, 返回和其相关联的值.
remove()方法用到了JS中的一个内置函数: delete.该函数是Object类的一部分, 使用对键的引用做为参数. 该函数同时删掉键和与其关联的值.
showAll()方法显示字典中全部的键值对.数据结构

Dictionary类的辅助方法

咱们还能够定义一些在特定状况下用的辅助方法.函数

...
count() {
    let n = 0;
    Object.keys(this._datastore).forEach(i => {
        n++
    });
    
    return n;
}
clear() {
    Object.keys(this._datastore).forEach(key => {
        delete this._datastore[key]
    });
}
...

好比, 要是能知道字典中的元素个数就行了, 那么就能够定义一个count()方法.
这里你可能就要问了, 既然_datastore是数组类型的话为何不直接用length属性呢? 这是由于当键的类型为字符串时, length属性就无论用了. eg:this

const nums = [];
nums[0] = 1;
nums[1] = 2;
log(nums.length); // 2

const book = [];
book['a'] = 1;
book['b'] = 2;
log(book.length); // 0

以及清空字典clear(). 这里使用this._datastore = []也是能够的;设计

Dictionary类添加排序功能

字典的主要用途是经过键取值, 咱们无需太关心数据在字典中的实际存储顺序. 然而, 不少人都但愿看到一个有序的字典. 下面来看看如何让前面的字典按顺序显示.code

数组是能够排序的, eg:对象

const a = [];
a[0] = 'm';
a[1] = 'd';
log(a); // m d

a.sort();
log(a); // d m

可是上面的这种作法是对字符串做为键的字典无效的, 程序会没有任何输出. 这和咱们前面定义count()方法时状况一致;排序

不过这也不是大问题. 用户关心的是显示字典的内容时, 结果是有序的. 可以使用Object.keys()函数解决这个问题, 从新定义showAll()方法:索引

showAll() {
    Object.keys(this._datastore).sort().forEach(key => {
        log(`${key}  ===>>>   ${this._datastore[key]}`)
    })
}

和前面的区别是: 拿到_datastore的键后, 调用sort()方法对键从新排序.rem

相关文章
相关标签/搜索