根据underscore精简的函数(数组篇)
来源:互联网 发布:网络社交的利与弊论点 编辑:程序博客网 时间:2024/06/05 12:02
这里将underscore.js内的函数进行精简,指在帮助理解或者快速回忆起underscore.js的原理,更深入的了解函数式编程。
本文基于underscore.js1.8.3版本,参考手册为
http://www.css88.com/doc/underscore/
这里将精简underscore中提供的针对数组的操作,部分API已经在《根据underscore精简的函数(集合篇)》中体现,不再赘述。
_.initial
var initial = function (array, n) { return Array.prototype.slice.call(array, 0, Math.max(0, array.length - (n == null ? 1 : n)));};var a =initial([5, 4, 3, 2, 1],2);console.log(a);
运行结果
[ 5, 4, 3 ]
_.rest
var rest=function(arr,n){ return Array.prototype.slice.call(arr,n==null?1:n);};var a =rest([5, 4, 3, 2, 1],2);console.log(a);
运行结果
[ 3, 2, 1 ]
_.first
var first=function(arr,n){ if(arr==null||arr.length<1) return void 0; if(n==null) return arr[0]; return initial(arr,arr.length-n);};var a =first([5, 4, 3, 2, 1],2);console.log(a);
运行结果
[ 5, 4 ]
_.flatten
var isArray=function(obj){ return Object.prototype.toString.call(obj)==='[object Array]';};var flatte=function(input,shallow,strict,startIndex){ var output=[],idx=0; for(var i=startIndex||0,length=input.length;i<length;i++){ var value=input[i]; if (isArray(value)){ if(!shallow) value=flatte(value,shallow,strict); var j=0,len=value.length; output.length+=len; while(j<len){ output[idx++]=value[j++]; } }else if(!strict){ output[idx++]=value; } } return output;};var flatten = function (array, shallow) { return flatte(array, shallow, false);};var a =flatten([1, [2], [3, [[4]]]]);var b =flatten([1, [2], [3, [[4]]]],true);console.log(a);console.log(b);
运行结果
[ 1, 2, 3, 4 ][ 1, 2, 3, [ [ 4 ] ] ]
_.uniq
var uniq=function(arr,isSorted){ var result=[],seen=[]; for(var i=0,length=arr.length;i<length;i++){ var value=arr[i], computed=value; if(isSorted){ if(!i||seen!==computed) result.push(value); seen=computed; }else if(result.indexOf(value)==-1){ result.push(value); } } return result;};var a=uniq([1,1,1,1,2,2,2,3,3]);console.log(a);
运行结果
[ 1, 2, 3 ]
_.intersection
var intersection=function(array){ var result=[]; var argsLength=arguments.length; for(var i=0,length=array.length;i<length;i++){ var item=array[i]; if (!(result.indexOf(item)==-1)) continue; for(var j=1;j<argsLength;j++){ if(arguments[j].indexOf(item)==-1) break; } if(j===argsLength) result.push(item); } return result;};var a=intersection([1, 2, 3], [101, 2, 1, 10], [2, 1]);console.log(a);
运行结果
[ 1, 2 ]
_.difference
var difference = function(array) { var rest = flatte(arguments, true, true, 1); return filter(array, function(value){ return (rest.indexOf(value)==-1); });};var a=difference([1, 2, 3, 4, 5], [5, 2, 10]);console.log(a);
运行结果
[ 1, 3, 4 ]
_.unzip
var unzip=function(array){ var length=array.length; var result=Array(length); for(var index=0;index<length;index++){ result[index]=_.pluck(array,index); } return result;};var names = ['moe', 'larry', 'curly'];var ages = [18, 23, 30];var sexes = ['male', 'female', 'male'];var students = unzip([names, ages, sexes]);console.log(students);
运行结果
[ [ 'moe', 18, 'male' ], [ 'larry', 23, 'female' ], [ 'curly', 30, 'male' ] ]
_.compact
var compact=function(array){ return filter(array,Boolean);};var a=compact([0, 1, false, 2, '', 3]);console.log(a);
运行结果
[ 1, 2, 3 ]
_.object
var object=function(list,values){ var result={}; for (var i=0,length=list.length;i<length;i++){ if(values){ result[list[i]]=values[i]; }else{ result[list[i][0]]=list[i][1]; } } return result;};var a=object(['moe', 'larry', 'curly'], [30, 40, 50]);var b=object([['moe', 30], ['larry', 40], ['curly', 50]]);console.log(a);console.log(b);
运行结果
{ moe: 30, larry: 40, curly: 50 }{ moe: 30, larry: 40, curly: 50 }
_.range
var range=function(start,stop,step){ if(stop==null){ stop=start||0; start=0; } if(!step){ step=stop<start?-1:1; } var length=Math.max(Math.ceil((stop-start)/step),0); var range=Array(length); for(var idx=0;idx<length;idx++,start+=step){ range[idx]=start; } return range;};var a=range(0,30,5);console.log(a);
运行结果
[ 0, 5, 10, 15, 20, 25 ]
_.chunk
var chunk=function(arr,count){ if(count==null||count<1) return []; var result=[]; var i=0,length=arr.length; while(i<length){ result.push(Array.prototype.slice.call(arr,i,i+=count)); } return result;};var a=chunk([1,2,3,4,5,6,7], 2);console.log(a);
运行结果
[ [ 1, 2 ], [ 3, 4 ], [ 5, 6 ], [ 7 ] ]
阅读全文
0 0
- 根据underscore精简的函数(数组篇)
- 根据underscore精简的函数(集合篇)
- underscore学习笔记—数组函数/Arrays
- 依赖库Underscore系列(2)--数组
- underscore 函数去抖的实现 #21
- 常用的 Underscore函数 记下随后补充
- nignx配置 underscore的排序函数 sortBy
- 依赖库Underscore系列(3)-函数
- underscore学习笔记—与函数有关的函数/Function
- underscore 扩展函数
- (一)underscore入门和数组类工具API学习
- underscore学习笔记—集合函数/collections(一)
- underscore学习笔记—集合函数/collections(二)
- underscore学习笔记—对象函数/Objects(一)
- underscore学习笔记—对象函数/Objects(二)
- underscore template的应用
- 优雅的underscore
- underscore 常用的方法
- 3. Longest Substring Without Repeating Characters
- centos7 修改yum源为阿里源
- Python练习2-随机数产生
- android中的BroadcastReceiver简单用法
- struts2 环境配置 (1)
- 根据underscore精简的函数(数组篇)
- Android中ScrollView和ListView嵌套使用时,进入界面不是从起始位置也即是不是从顶部显示问题
- vue2.0 动态路由传参方法
- spring boot 发送邮件
- 学习Javascript闭包(Closure),从外部读取局部变量
- 如何给SNMP Trap通道加上同步机制
- Bootstrap学习之四:表单
- maven 找不到符号 或者总是报编译错误
- 动态范围规划(调整)Dynamic Range Control的一些心得(一)