lodash源码(2)
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)的更多相关文章
- 读lodash源码之从slice看稀疏数组与密集数组
卑鄙是卑鄙者的通行证,高尚是高尚者的墓志铭. --北岛<回答> 看北岛就是从这两句诗开始的,高尚者已死,只剩卑鄙者在世间横行. 本文为读 lodash 源码的第一篇,后续文章会更新到这个仓 ...
- lodash源码分析之chunk的尺与刀
以不正义开始的事情,必须用罪恶使它巩固. --莎士比亚<麦克白> 最近很多事似乎印证了这句话,一句谎言最后要用一百句谎言来圆谎. 本文为读 lodash 源码的第二篇,后续文章会更新到这个 ...
- lodash源码分析之compact中的遍历
小时候, 乡愁是一枚小小的邮票, 我在这头, 母亲在那头. 长大后,乡愁是一张窄窄的船票, 我在这头, 新娘在那头. 后来啊, 乡愁是一方矮矮的坟墓, 我在外头, 母亲在里头. 而现在, 乡愁是一湾浅 ...
- lodash源码分析之Hash缓存
在那小小的梦的暖阁,我为你收藏起整个季节的烟雨. --洛夫<灵河> 本文为读 lodash 源码的第四篇,后续文章会更新到这个仓库中,欢迎 star:pocket-lodash gitbo ...
- lodash源码分析之NaN不是NaN
暗恋之纯粹,在于不求结果,完全把自己锁闭在一个单向的关系里面. --梁文道<暗恋到偷窥> 本文为读 lodash 源码的第五篇,后续文章会更新到这个仓库中,欢迎 star:pocket-l ...
- lodash源码分析之自减的两种形式
这个世界需要一个特定的恶人,可以供人们指名道姓,千夫所指:"全都怪你". --村上春树<当我谈跑步时我谈些什么> 本文为读 lodash 源码的第六篇,后续文章会更新到 ...
- lodash源码分析之List缓存
昨日我沿着河岸/漫步到/芦苇弯腰喝水的地方 顺便请烟囱/在天空为我写一封长长的信 潦是潦草了些/而我的心意/则明亮亦如你窗前的烛光/稍有暧昧之处/势所难免/因为风的缘故 --洛夫<因为风的缘故& ...
- lodash源码分析之缓存方式的选择
每个人心里都有一团火,路过的人只看到烟. --<至爱梵高·星空之谜> 本文为读 lodash 源码的第八篇,后续文章会更新到这个仓库中,欢迎 star:pocket-lodash gitb ...
- lodash源码分析之缓存使用方式的进一步封装
在世界上所有的民族之中,支配着他们的喜怒选择的并不是天性,而是他们的观点. --卢梭<社会与契约论> 本文为读 lodash 源码的第九篇,后续文章会更新到这个仓库中,欢迎 star:po ...
- lodash源码分析之baseFindIndex中的运算符优先级
我悟出权力本来就是不讲理的--蟑螂就是海米:也悟出要造反,内心必须强大到足以承受任何后果才行. --北岛<城门开> 本文为读 lodash 源码的第十篇,后续文章会更新到这个仓库中,欢迎 ...
随机推荐
- Delphi中对BCD码的直接支持 (转)
最近在Delphi下写软件,需要将数据转换为BCD码和将BCD码转换为其它数据类型,从网上搜索了一下,没有发现好的函数,于是就想自定义函数来完成BCD与其它格式的数据转换功能.但最终没有动手写,先查查 ...
- PHP 7 测试用例(转)
性能改善:PHP 7高达两倍快的PHP 5.6 显著减少内存使用 抽象语法树 一致的64位支持 改进的异常层次结构 许多转化为异常致命错误 安全随机数发生器 删除旧的和不支持的SAPIs和扩展 空合并 ...
- 转 用JS实现PHP的sprintf函数
函数如下: <script type="text/javascript"> function sprintf() { var arg = arguments, ...
- Color Processing 色彩处理
How to read and write pixel data Bitmap processing Image Stride Bayer Color Filter Pattern High-Qual ...
- Javascript 编程小技巧总结(部分内容借鉴他人)
1 – 使用===,而不是== ==(或!=)操作符在需要的时候会自动执行类型转换.===(或!==)操作不会执行任何转换.它将比较值和类型,而且在速度上也被认为优于==. 2 – 使用闭包实现私有变 ...
- unity3d插件Daikon Forge GUI 中文教程7-高级控件slider的使用
3.6.slider滑块 我们说说前面这个图片.对象 Appearance: Atlas 图集: Track 滑块的轨道图片 Back color滑块的轨道图片的主颜色. O ...
- c#面向对象基础 封装、继承
一.封装 这是一种隐藏的特性.可以用一个公式来展示类的封装特性: 封装的类=数据 + 对此数据进行的操作(即算法) 通俗的说,封装就是:包起外界不必要知道的东西,只向外界展露可供展示的东西. 在面 ...
- css问题 ie7兼容性问题
1.响应式网站用百分比时ie7不兼容:试试将margin:0 10% 改为margin-left:15%; 左边是可以的,但是右边就不行了 2.ie7的span 里的字会出现白色背景 ,是因为没有定高 ...
- 学习Jquery
早就听说了Jquery的大名,一直没有细心的学习一下,通过阅读收集的一些资料,感觉Jquery真的很强大.决定开始自己的学习Jquery之旅.在这里不是为大家讲解Jquery(深知水平有限),只是将自 ...
- 非静态的字段、方法或属性“System.Web.UI.Page.ClientScript...”要求对象引用 (封装注册脚本)
在写项目时想对asp.net的注册前台脚本事件进行封装,就添加了一个BasePage.cs页面,但一直报错‘非静态的字段.方法或属性“System.Web.UI.Page.ClientScript.. ...