JavaScript 数据结构 与 lodash
最近想用JavaScript补习一下数据结构的基础知识,但尝试开始之后有发现了几个问题:
JS是一种弱类型的高级语言,只有6个基本类型(字符串、数字、布尔、null、Undifined和Object)。若要实现数组(!最基础的数据结构),列表和链表等必需基于Object的,所以就没有像C语言一样数组必须定长,必须连续的限制。所以大学时学的C语言数据结构更多的是一种编程思想而没多大实际意义。
JS解释器对很多基础的算法做了优化,所以在一些基础的数据结构算法上没必要太注意。而且对计算性能要求很高的计算一般也不会选择JS。
JS内置的Array类不仅包含了数组的操作,而且也包含了很多队列、堆栈和集合的操作。
开源的underscore.js和lodash也包含了很多工具方法来处理一些基础的数据结构问题。
So, 我编写列一个Array.prototype和lodash关于数据结构与算法的列表,按照数据结构的方式进行索引。要了解详细内容当然还是查看文档和源码更准确。
数组操作
- length: Array的长度(唯一的一个属性)
- indexOf lastIndexOf: 找到某个值的索引,
- join: 生成字符串
- _.includes 是否包含某个元素
- _.at: 返回一个包含索引的新数组。
- _.fill 替换元素
- _.sample: 随机取几个值
排序
- reverse:倒转
- sort: 默认按照unicode进行排序。不生成新数组
- _.sortBy: 生成一个新数组
- _.shuffle: 给数组打乱顺序
截断、连接
- splice: 添加删除元素。神器
- concat: 连接多个数组
- slice _slice: 截取一部分数组
- _.compact: 返回所有 = = true 的元素
- _.chunk: 按照给定长长度给数组分组,返回一个二维数组
- .drop .dropWhile .dropRight .dropRightWhile:从第几个开始截取。
- _.remove: 删除所有符合的元素(操作原数组,返回被剪掉的数组)
- _.without 去掉所有值:生成新数组
- _.partition: 拆分两个数组,一组是符合条件的,一组是不符合条件的
迭代
- reduce:累计执行
- forEach forEachRight
- every: 全部 == true
- some: 至少有一个 == true
- filter:new _filter _reject
- map:new
列表:
- _initial: 所有元素除了最后一个
- _rest: 所有的元素除了第一个
- _sortedIndex:二分法查找插入的位置 _sortedLastIndex
- _zip _unzip _zipObject 矩阵
- _groupBy: 按某种条件进行分组
- _countBy: 符合某种条件的个数
- _max _min : 返回最大值最小值
集合:
- _difference: 返回多个集合的差别
- _intersection: 合集
- _union: 并集
- _uniq: 但个集合去重
队列&堆栈
- push: 从最后插入一个元素
- pop:返回最后一个元素,并删除
- shift:返回第一个元素,并删除
- _first _last: 返回第一个或最后一个的值,不删除
- _pull: 取出所有的值 _pullAt 取出指定位置的值
- _take: 从头开始取 n _takeRight: 从尾取 _takeWhile _takeRightWhile