当你细细琢磨一个 JavaScript 库(Underscore.js-2)

数组函数

数组是集合中的特例,有着优秀的品质。从抽象数据模型角度,可以模拟栈,队列,hash表,树的操作。实际在树的方法实现中也遵循了这种分类方式。

Underscore 不仅处理了规范的数组,同时也将这种能力拓展给了 arguments 类数组。
当然,前文针对集合的方法对于数组也同样适用。

构造数组 _.range([start], stop, [step])

一个用来创建整数灵活编号的列表的函数

_.range(10); // [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
_.range(1, 11); // [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
_.range(0, 30, 5); // [0, 5, 10, 15, 20, 25]
_.range(0, -10, -1); // [0, -1, -2, -3, -4, -5, -6, -7, -8, -9]
_.range(0); // []

数组索引

除了数组内置的方法,Underscore 提供了三个索引的封装

_.indexOf(array, value, [isSorted])

返回value在该 array 中的索引值,如果value不存在 array中就返回-

_.indexOf([1, 2, 3], 2); //1

_.lastIndexOf(array, value, [fromIndex])

返回value在该 array 中的从最后开始的索引值,如果value不存在 array中就返回-1

_.sortedIndex(list, value, [iteratee], [context])

使用二分查找确定value在list中的位置序号,value按此序号插入能保持list原有的排序。 如果提供iterator函数,iterator将作为list排序的依据,包括你传递的value 。 iterator也可以是字符串的属性名用来排序(比如length)。

var stooges = [{name: 'moe', age: 40}, {name: 'curly', age: 60}];
_.sortedIndex([10, 20, 30, 40, 50], 35); // 3
_.sortedIndex(stooges, {name: 'larry', age: 50}, 'age'); // 1

数组转化为对象 _.object(list, [values])

list 作为对象的 key,values 作为对象属性的 value, 如果 key 值重复,后边的 key值会覆盖前边的 key值。

_.object(['moe', 'larry', 'curly'], [30, 40, 50]);
=> {moe: 30, larry: 40, curly: 50}

_.object([['moe', 30], ['larry', 40], ['curly', 50]]);
=> {moe: 30, larry: 40, curly: 50}

数组截取

_.first(array, [n])

别名 _.head() _.take()

返回数组中前 n 个元素所组成的数组,n 不传则为 1,返回第一个元素(非数组)。

_.first([1,2,3,4,5], 2) // [1,2]

反方向就是 _.last(array, [n])

返回数组中从后向前的 n 个元素,规则与 first 相同

_.initial(array, [n])

排除数组后边的 n 个元素,n 不传则为1,返回除了尾部元素以外的剩余元素数组

反方向就是 _.rest(array, [index])

返回 index 以后的所有元素,index 不传则为 1

数组清洗

去伪存真 _.compact(array)

返回一个除去所有false值的 array副本,副本中无假值。可用于提取稀疏数组中的内容。

_.compact([0, 1, false, 2, '', 3]); // [1, 2, 3]

数组拓扑 _.flatten(array, [shallow])

将一个嵌套多层的数组 array(数组) (嵌套可以是任何层数)转换为只有一层的数组。 如果你传递 shallow参数,数组将只减少一维的嵌套。

_.flatten([1, [2], [3, [[4]]]]); //[1, 2, 3, 4];
_.flatten([1, [2], [3, [[4]]]], true); //[1, 2, 3, [[4]]];

矩阵置换 _.zip(...array)

将 每个arrays中相应位置的值合并在一起

_.zip(['moe', 'larry', 'curly'], [30, 40, 50], [true, false, false]);
=> [["moe", 30, true], ["larry", 40, false], ["curly", 50, false]]

删除指定值 _.without(array, ...value)

返回一个删除所有values值后的 array副本。(注:使用===表达式做相等测试。)

_.without([1, 2, 1, 0, 3, 1, 4], 0, 1); //[2, 3, 4]

除重 _.uniq(array, [isSorted], [iteratee])

别名: unique

返回 array去重后的副本, 使用 === 做相等测试. 如果您确定 array 已经排序, 那么给 isSorted 参数传递 true值, 此函数将运行的更快的算法. 如果要处理对象元素, 传参 iterator 来获取要对比的属性.

_.uniq([1, 2, 1, 3, 1, 4]); //[1, 2, 3, 4]

数组运算

并集 _.union(*arrays)

返回传入的 arrays(数组)并集:按顺序返回,返回数组的元素是唯一的,可以传入一个或多个 arrays(数组)。

_.union([1, 2, 3], [101, 2, 1, 10], [2, 1]); //[1, 2, 3, 101, 10]

交集 _.intersection(*arrays)

返回传入 arrays(数组)交集。结果中的每个值是存在于传入的每个arrays(数组)里。

_.intersection([1, 2, 3], [101, 2, 1, 10], [2, 1]); // [1, 2]

差集 _.difference(array, *others)

类似于without,但返回的值来自array参数数组,并且不存在于other 数组.

_.difference([1, 2, 3, 4, 5], [5, 2, 10]); //[1, 3, 4]
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 12,793评论 0 33
  • Underscore.js 简介 Underscore 是一个 JavaScript 库,在没有拓展任何内置对象的...
    Transnet2014阅读 353评论 0 2
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,280评论 19 139
  • 数组是一种可变的、可索引的数据集合。在Scala中用Array[T]的形式来表示Java中的数组形式 T[]。 v...
    时待吾阅读 1,025评论 0 0
  • 美国的微博,微博的对标,川普最重要的任性文字平台,翻墙后特别想去撒野一下的地方之一。每个注册用户都可以发送...
    路人耕阅读 8,912评论 0 0