js算法—数据结构

数据结构

一、js 原生 数据结构:   数据结构都是基于  原生数据结构  实现的。

重点:个人理解,数据结构就是储存数据的结构(如:数组、对象、set、map) https://www.cnblogs.com/zai1/p/11216368.html

1、数组:省略

2、对象: js 对象的属性名是包括空字符串在内的所有字符串,所以对象的属性名可以是中文。

   调用对象的方式,两种: 第二种 方式中,属性名是可以动态设置。

    stooge.first_name 、

    stooge[“first_name”]

3、集合(set):https://www.runoob.com/w3cnote/es6-map-set.html     类似于数组的储存,放在一个集合里

let mySet = new Set();
 
mySet.add(1); // Set(1) {1}
mySet.add(5); // Set(2) {1, 5}
mySet.add(5); // Set(2) {1, 5} 这里体现了值的唯一性
mySet.add("some text");  // Set(3) {1, 5, "some text"} 这里体现了类型的多样性

4、映射(Map):https://www.runoob.com/w3cnote/es6-map-set.html    (Map 对象保存键值对

      Map对象和数组有什么区别呢? https://blog.csdn.net/chenna1102cn/article/details/74931966  或 https://www.jb51.net/article/135685.htm

   Map 和 数组(二维数组) 可以互相转化。https://blog.csdn.net/z9061/article/details/83413015

      map 与 原生对象区别 :https://www.cnblogs.com/mengfangui/p/9934849.html

    map 的使用场景:https://www.jianshu.com/p/e6bc5a770b7a(推荐)

  理解:map数据类型就是弥补了  对象 属性名 只能字符串的限制。在字典数据结构上优势就很明显,键值对的键可以是数字,不需要把字符串再转成数字。

var myMap = new Map();
var key = "a string"; 
 
myMap.set(key, "和键'a string'关联的值"); // 这里的key可以是任意数据类型
 
myMap.get(key);    // "和键'a string'关联的值"
myMap.get("a string");   // "和键'a string'关联的值"
                         // 因为 key === 'a string'

二、数据结构:【数据结构 都是基于 js 本身的 数据类对象进行组合的,如对象、数组、map都可以变成字典】

1、字典【key-value】:数据处理中 字典类的数据处理是比较多的。(也叫枚举类型,typescript中的枚举类型就是了)

  场景:  比如 地区码 对应 地区名称。使用字典数据结构 处理会方便点。

  a、 一般我们从后端获取到的数据结构是一个数组,如

[{code:0001,city:'杭州'},{code:0002,city:'上海'},{code:0003,city:'南昌'}]

·  直接处理这种结构,总是要做一个循环,根据一个code值,去查对应的地区。如果把这种数据变成 字典 的数据结构。直接通过code值,获取到对应的地区。如下,字典结构:

{'0001':'杭州','0002':'上海','0003':'南昌'}

  b、js中可以实现 字典的 数据结构的 有几种方式:数组型的字典、对象型的字典、映射型(Map)型的字典。

// 数组型 字典
let arrList = []
arrList['0001'] = '杭州'
arrList['0002'] = '上海'
arrList['0003'] = '南昌'

// 对象型 字典
let arrList = {}
arrList['0001'] = '杭州'
arrList['0002'] = '上海'
arrList['0003'] = '南昌'

// 映射型 字典
let arrList = new Map()
arrList.set('0001', '杭州')
arrList.set('0002', '上海')
arrList.set('0003', '南昌')

  扩展知识:js的数组 如果 手动设置下边的话,这个数值就不能按照正常的数组来使用。因为数组长度可能就不准确了。  https://www.cnblogs.com/goloving/p/9180588.html

let arr = []
// 如果下边是字符串
arr['name'] = 'nice' // arr.length = 0

// 如果下标是 数字,以最大的下标表示 length
arr[80] = 'ueue'  // arr.length = 81

总结:数组型字典  因为下标和length是有关联的,对于下标不是自增型的字典并不友好。
           映射型字典  因为 Map对象自己有一套操作方法(查询是否有这个key,可以遍历等),感觉处理字典型数据是最好的。

2、列表:https://www.jianshu.com/p/cea9f3be42f5

var data = [
{ id: 1, name: "办公管理", pid: 0 },
{ id: 2, name: "请假申请", pid: 1 },
{ id: 3, name: "出差申请", pid: 1 },
{ id: 4, name: "请假记录", pid: 2 },
{ id: 5, name: "系统设置", pid: 0 },
{ id: 6, name: "权限管理", pid: 5 },
{ id: 7, name: "用户角色", pid: 6 },
{ id: 8, name: "菜单设置", pid: 6 },
];

  对列表的操作:【根据需要,可以实现各种操作。这里就说下常用的 添加 和 查找功能】

    添加:JS中一般通过数组的push方法,塞进去。【其它方法这里不介绍】

    查找:查找 name为特定值的那一项,它的pid的值? 【待补充。。。】

3、树:树结构是可以转化为列表的,即树结构的数据可以使用列表表示。https://blog.csdn.net/u013373006/article/details/82108873

var data = [
    {id: 1, name: "办公管理", pid: 0 ,
        children:[
            { id: 2, name: "请假申请", pid: 1,
                hildren:[
                    { id: 4, name: "请假记录", pid: 2 },
                ],
            },
            { id: 3, name: "出差申请", pid: 1},
        ]
    },
    {id: 5, name: "系统设置", pid: 0 ,
        children:[
            { id: 6, name: "权限管理", pid: 5,
                hildren:[
                    { id: 7, name: "用户角色", pid: 6 },
                    { id: 8, name: "菜单设置", pid: 6 },
                ]
            },
        ]
    },
];

    树结构转化为列表:【因为列表中 pid 项 说明了,当前项所在树的层级。】

    注意:这数组的顺序是有意义的,只要数组下面的pid和他一样或比它小,后面的数组就不是他的后代节点了。

var data = [
{ id: 1, name: "办公管理", pid: 0 },
{ id: 2, name: "请假申请", pid: 1 },
{ id: 3, name: "出差申请", pid: 1 },
{ id: 4, name: "请假记录", pid: 2 },
{ id: 5, name: "系统设置", pid: 0 },
{ id: 6, name: "权限管理", pid: 5 },
{ id: 7, name: "用户角色", pid: 6 },
{ id: 8, name: "菜单设置", pid: 6 },
];

  对树的操作:

    递归查找某一项:https://blog.csdn.net/weixin_45613604/article/details/109839225

 4、链表:再js中根本没有什么用武之地。

  说明:列表主要是针对那些数组初始化定好长度的语言,后期添加比较麻烦,才用链表去实现。再速度和操作上会快速方便写。js的数组本身就是可以随便添加删除的,所以基本不用链表。

5、

 

 


 

 

posted @ 2021-03-30 16:47  吴飞ff  阅读(342)  评论(0编辑  收藏  举报