资讯专栏INFORMATION COLUMN

数据结构-字典

ad6623 / 1303人阅读

摘要:字典是一种以键值对形式存储结构的数据结构就像电话号码薄里的名字和电话号码一样要找一个电话时先找名字名字找到了紧挨着它的电话号码也就找到了这里的键是指你用来查找的东西值是查找得到的结果的类就是以字典形式设计的本章将使用类本身的特性实现一个类

字典是一种以  -  对形式存储结构的数据结构, 就像电话号码薄里的名字和电话号码一样. 要找一个电话时, 先找名字, 名字找到了, 紧挨着它的电话号码也就找到了. 这里的  是指你用来查找的东西,  是查找得到的结果.
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("
") 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:

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类添加排序功能

字典的主要用途是通过键取值, 我们无需太关心数据在字典中的实际存储顺序. 然而, 很多人都希望看到一个有序的字典. 下面来看看如何让前面的字典按顺序显示.

数组是可以排序的, 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()方法对键重新排序.

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/98185.html

相关文章

  • fsLayuiPlugin数据字典使用

    摘要:概述数据字典主要解决下拉框数据填充和数据表格转义处理,一个数据字典可以多处使用。通过服务端异步请求加载数据列表。 概述 数据字典主要解决下拉框数据填充和数据表格转义处理,一个数据字典可以多处使用。 1.多个页面下拉框使用同样的数据,改一个地方需要把所有页面都要修改 2.数据表格转义代替自己手动写templet解析模板数据字典提供一个通用的处理方式,支持配置静态数据字典和动态数据...

    yhaolpz 评论0 收藏0
  • fsLayuiPlugin数据字典使用

    摘要:概述数据字典主要解决下拉框数据填充和数据表格转义处理,一个数据字典可以多处使用。通过服务端异步请求加载数据列表。 概述 数据字典主要解决下拉框数据填充和数据表格转义处理,一个数据字典可以多处使用。 1.多个页面下拉框使用同样的数据,改一个地方需要把所有页面都要修改 2.数据表格转义代替自己手动写templet解析模板数据字典提供一个通用的处理方式,支持配置静态数据字典和动态数据...

    sunny5541 评论0 收藏0
  • 《Javascript数据结构和算法》笔记-「字典和散列表」

    摘要:我经常在业务代码中把数据处理成这种字典的数据结构获取的方法哈希表在学习了类之后,我们会学习散列表,也就是哈希表。 《Javascript数据结构和算法》笔记-「字典和散列表」 集合、字典、散列表存储的都是「不重复」的数据结构 集合:我们更关注每一个元素的值,并把其作为主要元素 字典:我们用[键,值]的形式来存储数据 散列表: 跟字典类似,也会是用[键,值]的形式来存储数据 但是「字...

    wenyiweb 评论0 收藏0
  • 非顺序数据结构——字典

    摘要:作用通过键值对来存储不重复的值的,与集合相比,集合是通过值值来存储不重复的值字典所需功能跟据传入的值向字典中添加元素通过移除字典中对应的值通过某个键来判断是否含有某个值通过给定的键查找到特定的值并返回将字典置为空获取字典的容量获取字典 作用 通过键值(key-value)对来存储不重复的值的,与集合相比,集合是通过值值(value-value)来存储不重复的值 字典所需功能 跟据传入...

    chavesgu 评论0 收藏0
  • 学习JavaScript数据结构与算法 — 字典

    摘要:方法向字典中添加新元素。通过键值查找特定的数值并返回。将这个字典中的所有元素全部删除。将字典所包含的所有数值以数组形式返回。 定义 通俗地说,字典就是键值对[键,值],是键到值的映射关系。 方法 set(key,value):向字典中添加新元素。 remove(key):通过使用键值来从字典中移除键值对应的数据值。 has(key):如果某个键值存在于这个字典中,则返回true,反之...

    leanote 评论0 收藏0
  • python-数据类型之字典

    摘要:删除字典元素和字典删除键为的条目删除中所有的条目删除整个字典删除并返回键为的条目二字典相关函数工厂方法工厂函数被用来创建字典。与函数方法相似,如果字典中键存在,删除并返回,如果键不存在,且没有给出的值,引发异常。 Python字典是另一种可变容器模型,且可存储任意类型对象,如字符串、数字、元组等其他容器模型。一、创建字典(一)字典的增删改查(1)字典的创建key:(不可变类型)数字、字...

    SmallBoyO 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<