最近想用JavaScript补习一下数据结构的基础知识,但尝试开始之后有发现了几个问题

  1. JS是一种弱类型的高级语言,只有6个基本类型(字符串、数字、布尔、null、Undifined和Object)。若要实现数组(!最基础的数据结构),列表和链表等必需基于Object的,所以就没有像C语言一样数组必须定长,必须连续的限制。所以大学时学的C语言数据结构更多的是一种编程思想而没多大实际意义。

  2. JS解释器对很多基础的算法做了优化,所以在一些基础的数据结构算法上没必要太注意。而且对计算性能要求很高的计算一般也不会选择JS。

  3. JS内置的Array类不仅包含了数组的操作,而且也包含了很多队列、堆栈和集合的操作。

  4. 开源的underscore.js和lodash也包含了很多工具方法来处理一些基础的数据结构问题。

So, 我编写列一个Array.prototypelodash关于数据结构与算法的列表,按照数据结构的方式进行索引。要了解详细内容当然还是查看文档和源码更准确。

数组操作

  • 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