我们调用Array的map()方法,虽然以前也使用过jav

缘由 即便从前也接纳过javascript语言,但到底是为着协作后端写的片段零零碎碎的“代码段”,更不能够算得javascript项目了。很赏心悦指标是前段时间刚到厂商刚刚碰上项目始于推倒重写,我们team从头起头做架议和促成,目标很清楚,为了精雕细刻和超过前边的本子。那是个实留意义上的javascript“项目”,当然服务端不是我们team来担当啊。那也是本人真正开端专职使用javascript来编制程序。由于事情发生从前在高校对情势化方法那门课程比较感兴趣,而javascript又是函数式语言,因而小编想把更加多functional的东西用javascript来表现一下。多少个函数 那多少个法子均为javascript 1.6 数组新扩大的点子。是很杰出的functional 函数,当然也十一分实用。上边是functional的概念并不出自javascript。filter:接纳二个集结Xs,三个谓词,那些谓词是从X到bool的投射。然后过虑那个集合,并赶回谓词为true的成分结合的聚合。下边是总结的兑现: 复制代码 代码如下: function filter{ var i,out=[]; for{ if out.push; } return out; } 再加贰个精简的测验: 复制代码 代码如下: var arr = [1,2,3,4,5,6,7,8,9,10]; var even = function{ if(typeof item !== "number") return false; return !; }; var filtered = filter; console.log; 结果: 2,4,6,8,10 map:选拔叁个集合Xs,贰个函数f,然后把Xs集结中每一个成分依据顺序使用f映射,并重回会集f x1, f x2, f x3 ... f xn。完成如下: 复制代码 代码如下: function map{ var i,l= arr && arr.length || 0,out = new Array out[i]=callback; return out; } 测量试验一下: 复制代码 代码如下: var arr = [1,2,3,4,5,6,7,8,9,10]; var addTen = function{ return item + 10; }; var mapAdded = map; console.log; 结果: 11,12,13,14,15,16,17,18,19,20 此外还只怕有forEach,every和some五个函数在javascript 1.6中现身。但在行使进程中以为依然紧缺一个苍劲的函数,它就是折叠函数。正所谓map-reduce,有了map而从未"reduce"岂不是很扫兴?下边就来寻访这几个”reduce“。 Reduce的实现 上边说的reduce其实相当于折叠函数。它承当贰个Xs会集,三个二元操作符f。然后将f插入到聚聚集的每四个相邻成分之间。举例,fold plus [1,2,3,4] 意即 1+2+3+4。为了进一步准确,平时须求三个”开端成分“作为f最最初时的第3个参数。例如fold plus [1,2,3,4] 意即 。上边是贯彻: 复制代码 代码如下: function fold{ var i,x; if x=b,i=0; else x=arr[0],i=1; for x=callback; return x; } 测量检验: 复制代码 代码如下: var arr = [1,2,3,4,5,6,7,8,9,10]; var plus = function{ return a+b; }; var foldPlus = fold; console.log; 结果: 55 那么些函数在ECMAScript 5中名字就叫reduce,而函数式里面普通称做fold而已,那是很形象的名字。 总结 其实上面在完结这几个functional函数的时候编写风格而不是函数式的,因为javascript 语言有具有循环语句。若无循环语句呢?留给下叁回搜求吧。

前言
在前大器晚成篇随笔javascript之标准高阶函数中关键达成了多少个特出的functional函数。小说最终也建议了疑义,为何那样的贯彻与F#等等的函数式语言“不太同样”呢?今天来试试看更“函数式”的落实。

1.高阶函数(Higher-order function)

叁个函数采取另八个函数作为参数,那么这种函数就叫做高阶函数。

function add(x,y,f){
 return f(x) + f(y)    ==> Math.abs(x) + Math.abs(y)
}
add(-1,2,Math.abs);

另大器晚成种实现
相似地,尝试对在此之前达成的函数做一些改观,把for循环去掉。怎么样去掉吧?这里先要引进叁个汇聚的归结法定义:

2.map()

map()方法是概念在js的array中的,大家调用Array的map()方法,传入大家同心合力的函数,就得到了贰个新的Array作为结果。

function pow(x){
   return x * x;
}
var arr = [1,2,3,4];
arr.map(pow);  //[1,4,9,16]

把f(x)效用在Array的每叁个成分并把结果生成二个新的Array。map()抽象了运算规则。

var arr = [1,2,3];
arr.map(String);  //['1','2','3']

应用map将数组转变为object 

var arr = [ 1 , 2 , 3 , 4 ]
var obj = arr.map(function(item){
      return {value: item,label: item}
})

图片 1

obj

实际上是遍历数组中的每二个因素,再推行相应的操作。

一个会师要么是空集,要么是几个数与贰个会晤组成的数对从概念能够看出,每一个汇集都可以看作为三个数和一个集聚的对。比方:{1,2,4,5} 能够以为是数 1 与 集结{2,4,5} 组成的大器晚成对,写成(1 , {2,4,5})。递归地,{2,4,5} 能够用作是(2 , {4,5})。最终即为 (5 , Ø)。按照那样的精通,大家就足以用递归的形式消释循环,因为大家在讲授的时候曾经访问了每三个数目项,而且终结条件为空集。上边就看一下filter函数的另八个兑现,原函数名加前缀f以分别早前函数:

3.reduce()

Array的reduce()把二个函数效用在此个Array的[x1,x2,x3,...]上,reduce()把结果一连和种类的下一个要素做积存总计。

[x1,x2,x3,x4].reduce(f) =f(f(f(x1,x2),x3),x4) 

var arr = [1,2,3,4];
arr.reduce(function(x1,x2){    //佚名函数
        return x1*x2;
});

复制代码 代码如下:

4.filter()

filter()用于把array中的有些因素过滤掉,然后回来剩下的要素。

filter()把传播的函数效能到各种成分上,然后依照重临值是true依然false决定封存依旧放弃。

var arr = [1,2,3,4];
var arr1 = arr.filter(function(x){
      return x % 2 == 0;
});
arr1;   // [2,4]

trim():方法会删除叁个字符串两端的空白字符串。在这里个字符串里的具有空格字符(space,tab,no-breakspace卡塔尔国以致独具的行甘休符(LF,C奔驰G级卡塔 尔(阿拉伯语:قطر‎

var  str = '  bac  ';
console.log(str.trim());   //bac
console.log(str);//  bac   (有空格)   ---不改造原字符串

删去数组中的空字符串

var arr = [1,2,' ',null,undefined,'c'];
var r = arr.filter(function(s){
   return s&&s.trim()   
});
console.log(r);   //   [1,2,'c']

function ffilter(arr,callback){
var i=arguments[2] || 0,
  out = arguments[3] || [];
if(!arr[i]) return arguments[3];
if(callback(arr[i]))
out.push(arr[i]);
return arguments.callee(arr,callback,++i,out);
}

5.sort()

sort()方法用于对数组举行排序,排序的方法不适合常规:(暗许把全数的因素先转变到String再遵照ASCII码排序卡塔 尔(英语:State of Qatar)

var arr = [1,2,12,01];
arr.sort(); //[1,1,12,2]

数组去重:

var arr = [1,2,1,3,4];
var a = arr.filter(function(element,index,array){
        return arr.indexOf(element) == index;
});
a; //[1,2,3,4]

鉴于sort()方法排序的不符常理,我们能够自身定义排序法则,然后传入作为sort()方法的参数。

var arr = [2,5,1,7,3];
console.log(arr.sort(compare));    // [1,2,3,5,7]
console.log(arr);      // [1,2,3,5,7]    --- 间接退换原数组
function compare(x,y){
    return x-y;            //升序          y-x    // 降序
}

测试:

复制代码 代码如下:

var arr = [1,2,3,4,5,6,7,8,9,10];
var even = function(item){
if(typeof item !== "number") return false;
return !(item & 1);
};
console.log(ffilter(arr,even));

本文由必威发布于必威-运维,转载请注明出处:我们调用Array的map()方法,虽然以前也使用过jav

相关阅读