1.flatten 对深层嵌套数组的抹平

_.flatten([1, [2, 3, [4]]]);
* // => [1, 2, 3, [4]]
*
* // using `isDeep`
* _.flatten([1, [2, 3, [4]]], true);
* // => [1, 2, 3, 4]
在方法中使用了递归的算法: 1.递归的产生条件 2.递归的结束条件 递归就是数学的归纳法,采用数据结构的栈的模式
自己做的递归的一个算法(原lodash涉及了很多个文件,这里只是提供了一个简单的思路.并没有对数据类型做更详细的判断)
function baseFlatten(array, isDeep, isStrict, result) {    //baseFlatten中传入result是为了在递归中,保留以前的数据
    result || (result = []);                     //如果没有传入result则默认的是空的[]
var index = -1,
length = array.length;
while (++index < length) {
if (Array.isArray(array[index])) { //递归的条件
var value = array[index];
if (isDeep) {
baseFlatten(value, isDeep, isStrict, result);
}
} else {
result.push(array[index]) //递归的结束
}
}
return result;
} 2.indexOf 求索引
js使用原生的indexOf来判断变量在数组中的位置
但是在性能上与while循环或者for循环相比差的比较多
var i = 0;
var arr = [];
while (i++ < 2000000) {
arr.push(i + ''+i );
} var old = Date.now();
console.log(arr.indexOf(''));
console.log(old, Date.now(), Date.now() - old); function baseIndexOf(array, value) {
var index = 0,
length = array.length;
var old1 = Date.now(); while (++index < length) {
if (array[index] === value) {
console.log(old1, Date.now(), Date.now() - old1,index);
return index;
}
}
console.log(old1, Date.now(), Date.now() - old1,i); return -1;
}
baseIndexOf(arr,''); function baseIndexOf(array, value) {
var length = array.length;
var old1 = Date.now();
for(var i = 0;i <length;i++){
if (array[i] === value) {
console.log(old1, Date.now(), Date.now() - old1,i);
return i;
}
}
console.log(old1, Date.now(), Date.now() - old1,i); return -1;
}
baseIndexOf(arr,''); /*

-1
1479287884122 1479287884172 50
1479287884174 1479287884199 25 2000000
1479287884199 1479287884224 25 2000000

*/
3.pull方法,移除某多个元素,其中使用了原生的splice方法,而对于slice方法,lodash则改写了这个方法,使用while循环,空数组赋值的方式.pull传入的参数是元素.pullAt是传入的索引.
function pull() {
var args = arguments,
array = args[0]; if (!(array && array.length)) {
return array;
}
var index = 0,
indexOf = baseIndexOf,
length = args.length; while (++index < length) { //主循环,对arguments进行主循环,针对于传入多个要移除的元素 _.pull(array, 2, 3);
    var fromIndex = 0,
value = args[index]; while ((fromIndex = indexOf(array, value, fromIndex)) > -1) { // var array = [1, 2, 3, 1, 2, 3] 需要多次循环,如果有这个值,则index > -1,如果没有这个值则index = -1则内循环停止,接着进下一个主循环.
      splice.call(array, fromIndex, 1);
}
}
return array;
}
4.pullAt  pull出传入的索引,内部实现采用splice方法,splice方法会更改原数组.

例如:

var array = [5, 10, 15, 20];
var evens = _.pullAt(array, 1, 3);
源码:
function basePullAt(array, indexes) {
var length = array ? indexes.length : 0;
while (length--) {
var index = indexes[length];
if (index != previous && isIndex(index)) {
var previous = index;
splice.call(array, index, 1);
}
}
return array;
}
/*
根据索引去除数组中某个数据,没有很方便的方法,只能使用splice方法,通过索引来删除某个值.
原数组只剩下 删除后的 新的则是返回的数组内容
*/ 5.remove 作用与pull pullAt remove 是一样的,只是传入的参数不同,remove传入的参数是fucntion(){}
function remove(array, predicate, thisArg) {
var result = [];
if (!(array && array.length)) {
return result;
}
var index = -1,
indexes = [],
length = array.length; predicate = baseCallback(predicate, thisArg, 3);
while (++index < length) {
var value = array[index];
if (predicate(value, index, array)) {
result.push(value); //因为pullAt中调用了splice方法,这里返回的结果是符合function条件的.通过这种方式返回了.注意返回结果别搞混了.
      indexes.push(index);                  //获取到索引的集合,然后通过索引的集合调用pullAt方法
}
}
basePullAt(array, indexes);
return result;
}

lodash源码(2)的更多相关文章

  1. 读lodash源码之从slice看稀疏数组与密集数组

    卑鄙是卑鄙者的通行证,高尚是高尚者的墓志铭. --北岛<回答> 看北岛就是从这两句诗开始的,高尚者已死,只剩卑鄙者在世间横行. 本文为读 lodash 源码的第一篇,后续文章会更新到这个仓 ...

  2. lodash源码分析之chunk的尺与刀

    以不正义开始的事情,必须用罪恶使它巩固. --莎士比亚<麦克白> 最近很多事似乎印证了这句话,一句谎言最后要用一百句谎言来圆谎. 本文为读 lodash 源码的第二篇,后续文章会更新到这个 ...

  3. lodash源码分析之compact中的遍历

    小时候, 乡愁是一枚小小的邮票, 我在这头, 母亲在那头. 长大后,乡愁是一张窄窄的船票, 我在这头, 新娘在那头. 后来啊, 乡愁是一方矮矮的坟墓, 我在外头, 母亲在里头. 而现在, 乡愁是一湾浅 ...

  4. lodash源码分析之Hash缓存

    在那小小的梦的暖阁,我为你收藏起整个季节的烟雨. --洛夫<灵河> 本文为读 lodash 源码的第四篇,后续文章会更新到这个仓库中,欢迎 star:pocket-lodash gitbo ...

  5. lodash源码分析之NaN不是NaN

    暗恋之纯粹,在于不求结果,完全把自己锁闭在一个单向的关系里面. --梁文道<暗恋到偷窥> 本文为读 lodash 源码的第五篇,后续文章会更新到这个仓库中,欢迎 star:pocket-l ...

  6. lodash源码分析之自减的两种形式

    这个世界需要一个特定的恶人,可以供人们指名道姓,千夫所指:"全都怪你". --村上春树<当我谈跑步时我谈些什么> 本文为读 lodash 源码的第六篇,后续文章会更新到 ...

  7. lodash源码分析之List缓存

    昨日我沿着河岸/漫步到/芦苇弯腰喝水的地方 顺便请烟囱/在天空为我写一封长长的信 潦是潦草了些/而我的心意/则明亮亦如你窗前的烛光/稍有暧昧之处/势所难免/因为风的缘故 --洛夫<因为风的缘故& ...

  8. lodash源码分析之缓存方式的选择

    每个人心里都有一团火,路过的人只看到烟. --<至爱梵高·星空之谜> 本文为读 lodash 源码的第八篇,后续文章会更新到这个仓库中,欢迎 star:pocket-lodash gitb ...

  9. lodash源码分析之缓存使用方式的进一步封装

    在世界上所有的民族之中,支配着他们的喜怒选择的并不是天性,而是他们的观点. --卢梭<社会与契约论> 本文为读 lodash 源码的第九篇,后续文章会更新到这个仓库中,欢迎 star:po ...

  10. lodash源码分析之baseFindIndex中的运算符优先级

    我悟出权力本来就是不讲理的--蟑螂就是海米:也悟出要造反,内心必须强大到足以承受任何后果才行. --北岛<城门开> 本文为读 lodash 源码的第十篇,后续文章会更新到这个仓库中,欢迎 ...

随机推荐

  1. 定位absolute使内联支持宽高(块属性变为内联,内容默认撑开)margin auto 失效

    relative   没脱离文档流 absdute 完全脱离文档流 margin :auto 失效 相对整个文档偏离 相对父级定位 fixed 脱离文档流 与绝对定位特性一致 3.P标快不能包块级标签 ...

  2. ACM 矩形的个数

    矩形的个数 时间限制:1000 ms  |  内存限制:65535 KB 难度:1   描述 在一个3*2的矩形中,可以找到6个1*1的矩形,4个2*1的矩形3个1*2的矩形,2个2*2的矩形,2个3 ...

  3. css learn

    float: 1.margin属性本身与float无关.写不写float都可以margin. 2.top,right,bottom,left和z-index都无法使用. 3.父元素浮动,子元素在其中仍 ...

  4. Oracle 字符串函数

    平常我们用Oracle主要有两种字符串类型1.char始终为固定的长度,如果设置了长度小于char列的值,则Oracle会自动用空格填充的.当比较char时,Oracle用空格将其填充为等长,再进行比 ...

  5. kinderEditor + Struts2整合

    环境: kinderEditor4.1.5 Struts2.3.5 Spring3.0.5 Hibernate3.6 代码: FileManageAction package com.hcsoft.p ...

  6. Rnadom Teams

    Rnadom  Teams 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.actioncid=88890#problem/B 题目: Descript ...

  7. iosiPhone屏幕尺寸、分辨率及适配

    iosiPhone屏幕尺寸.分辨率及适配     1.iPhone尺寸规格 设备 iPhone 宽 Width 高 Height 对角线 Diagonal 逻辑分辨率(point) Scale Fac ...

  8. select()函数 timval问题

    如果select调用中设置了等待时间,那么每次调用时都需要重新对这个时间赋值.例如: struct timval tv; while(1) { ........;   tv.tv_sec = 2;   ...

  9. Trie字典树 动态内存

    Trie字典树 #include "stdio.h" #include "iostream" #include "malloc.h" #in ...

  10. [LintCode] Binary Tree Paths 二叉树路径

    Given a binary tree, return all root-to-leaf paths.Example Given the following binary tree: 1 /   \2 ...