es6 非常实用的必备技能, 代替for循环,方法有很多哦

文章主要介绍了数组Array.prototype方法的使用,需要的朋友可以参考下,如果你是大神,请直接无视。

在ES5中,一共有9个Array方法 http://kangax.github.io/compat-table/es5/

  Array.prototype.indexOf

  Array.prototype.lastIndexOf

  Array.prototype.every

  Array.prototype.some

  Array.prototype.forEach

  Array.prototype.map

  Array.prototype.filter

  Array.prototype.reduce

  Array.prototype.reduceRight

在ES6即将普及的时代,我相信这些方法对FE开发者是非常实用的必备技能,接下来我将通过实例帮大家替换for循环大法,更高效的来操作数组。

1、indexOf

indexOf()方法返回在该数组中第一个找到的元素位置,如果它不存在则返回-1。

使用for:

var arr = ['apple','orange','pear'],

    found = false;

for(var i= 0, l = arr.length; i< l; i++){

    if(arr[i] === 'orange'){

        found = true;

    }

}

console.log("found:",found);

使用indexOf:

var arr = ['apple','orange','pear'];  

console.log("found:", arr.indexOf("orange") != -1);

2、lastindexOf

lastIndexOf() 方法返回在该数组中最后一个找到的元素位置,和 indexof相反。

3、every()

every()可是检测数组中的每一项是否符合条件

使用for:

/* 

* 是否全部大于0

*/

var ary = [12,23,24,42,1];

var result = function(){

  for (var i = 0; i < ary.length; i++) {

    if(ary[i] < 0){

       return false;

    }

  }

  return true; //需全部满足

}

console.log(result()) //全部满足,返回true

使用every:

var ary = [12,23,24,42,1];

var result = ary.every(function(item, index){

  return item > 0

})

console.log(result)

4、some()

some()可以检测数组中是否有某一项符合条件

使用for:

/* 

* 是否存在小于0的项

*/

var ary = [12,23,-24,42,1];

var result = function(){

  for (var i = 0; i < ary.length; i++) {

    if(ary[i] < 0){

       return true;

    }

  }

  return false; //只需满足一个

}

console.log(result())  //有一项小于0,返回true

使用some:

var ary = [12,23,-24,42,1];

var result = ary.some(function(item, index){

  return item < 0

})

console.log(result)

5、 forEach() 

forEach为每个元素执行对应的方法

使用for:

var arr = [1,2,3,4,5,6,7,8];

for(var i= 0, l = arr.length; i< l; i++){

console.log(arr[i]);

}

使用forEach():

var arr = [1,2,3,4,5,6,7,8];

arr.forEach(function(item,index){

console.log(item);

});

forEach是用来替换for循环的

6、 map()

map()对数组的每个元素进行一定操作(映射)后,会返回一个新的数组, 

使用for:

var oldArr = [{first_name:"Colin",last_name:"Toh"},{first_name:"Addy",last_name:"Osmani"},{first_name:"Yehuda",last_name:"Katz"}];

function getNewArr(){

  var newArr = [];

  for(var i= 0, l = oldArr.length; i< l; i++){

    var item = oldArr[i];

    item.full_name = [item.first_name,item.last_name].join(" ");

    newArr[i] = item;

  }

  return newArr;

}

console.log(getNewArr());

使用map:

var oldArr = [{first_name:"Colin",last_name:"Toh"},{first_name:"Addy",last_name:"Osmani"},{first_name:"Yehuda",last_name:"Katz"}];

function getNewArr(){

  return oldArr.map(function(item,index){

    item.full_name = [item.first_name,item.last_name].join(" ");

    return item;

  });

}

console.log(getNewArr());

map()是处理服务器返回数据时是一个非常实用的函数。

forEach 与map的区别:

语法:forEach和map都支持2个参数:一个是回调函数(item,index,list)和上下文;

forEach:用来遍历数组中的每一项;这个方法执行是没有返回值的,对原来数组也没有影响;数组中有几项,那么传递进去的匿名回调函数就需要执行几次;每一次执行匿名函数的时候,还给其传递了三个参数值:数组中的当前项item,当前项的索引index,原始数组list;理论上这个方法是没有返回值的,仅仅是遍历数组中的每一项,不对原来数组进行修改;但是我们可以自己通过数组的索引来修改原来的数组

forEach方法中的this是ary,匿名回调函数中的this默认是window;

var ary = [12,23,24,42,1];

var res = ary.forEach(function (item,index,input) {

  input[index] = item*10;

})

console.log(res);//-->undefined;

console.log(ary);//-->会对原来的数组产生改变;

map: 和forEach非常相似,都是用来遍历数组中的每一项值的,用来遍历数组中的每一项;

区别:map的回调函数中支持return返回值;return的是啥,相当于把数组中的这一项变为啥(并不影响原来的数组,只是相当于把原数组克隆一份,把克隆的这一份的数组中的对应项改变了);

不管是forEach还是map 都支持第二个参数值,第二个参数的意思是把匿名回调函数中的this进行修改。

var ary = [12,23,24,42,1];

var res = ary.map(function (item,index,input) {

  return item*10;

})

console.log(res);//-->[120,230,240,420,10];

console.log(ary);//-->[12,23,24,42,1];

7、 filter

该filter()方法创建一个新的匹配过滤条件的数组。

使用for:

var arr = [

  {"name":"apple", "count": 2},

  {"name":"orange", "count": 5},

  {"name":"pear", "count": 3},

  {"name":"orange", "count": 16},

];

var newArr = [];

for(var i= 0, l = arr.length; i< l; i++){

  if(arr[i].name === "orange" ){

    newArr.push(arr[i]);

  }

}

console.log("Filter results:",newArr);

使用 filter():

var arr = [

  {"name":"apple", "count": 2},

  {"name":"orange", "count": 5},

  {"name":"pear", "count": 3},

  {"name":"orange", "count": 16},

];

var newArr = arr.filter(function(item){

  return item.name === "orange";

});

console.log("Filter results:",newArr);

8、 reduce()

reduce()可以实现一个累加器的功能,将数组的每个值(从左到右)将其降低到一个值。 说实话刚开始理解这句话有点难度,它太抽象了。 

场景: 统计一个数组中有多少个不重复的单词 

使用for:

var arr = ["apple","orange","apple","orange","pear","orange"];

function getWordCnt(){

  var obj = {};

  for(var i= 0, l = arr.length; i< l; i++){

    var item = arr[i];

    obj[item] = (obj[item] +1 ) || 1;

  }

  return obj;

}

console.log(getWordCnt());

让我先解释一下我自己对reduce的理解。reduce(callback, initialValue)会传入两个变量。回调函数(callback)和初始值(initialValue)。假设函数它有个传入参数,prev和next,index和array。prev和next你是必须要了解的。一般来讲prev是从数组中第一个元素开始的,next是第二个元素。但是当你传入初始值(initialValue)后,第一个prev将是initivalValue,next将是数组中的第一个元素。 

/* 

* 二者的区别,在console中运行一下即可知晓

*/

var arr = ["apple","orange"];

function noPassValue(){

  return arr.reduce(function(prev,next){

    console.log("prev:",prev);

    console.log("next:",next);

    return prev + " " +next;

  });

}

function passValue(){

  return arr.reduce(function(prev,next){

    console.log("prev:",prev);

    console.log("next:",next);

    prev[next] = 1;

    return prev;

  },{});

}

console.log("No Additional parameter:",noPassValue());

console.log("----------------");

console.log("With {} as an additional parameter:",passValue());

9.reduceRight()

 reduceRight的语法以及回调函数的规则和reduce方法是一样的,区别就是在与reduce是升序,即角标从0开始,而reduceRight是降序,即角标从arr.length-1开始。

方法可应用于字符串。

/* 

* 使用此方法反转字符串中的字符

*/

var word = "retupmoc";

function AppendToArray(previousValue, currentValue) {

  return previousValue + currentValue;

}

var result = [].reduceRight.call(word, AppendToArray, "the ");

console.log(result); // the computer

补.isArray()

isArray()是Array对象的一个静态函数,用来判断一个对象是不是数组

var ary1 = [];

var res1 = Array.isArray(ary1);  // Output: true

console.log(res1)

var ary2 = new Array();

var res2 = Array.isArray(ary2);  // Output: true

console.log(res2)

var ary3 = [1, 2, 3];

var res3 = Array.isArray(ary3);  // Output: true

console.log(res3)

var ary4 = new Date();

var res4 = Array.isArray(ary4);  // Output: false

console.log(res4)

希望对你有帮助~   反正对我是很有帮助

转自《一个不会写文章的程序猿》

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,047评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,807评论 3 386
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,501评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,839评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,951评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,117评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,188评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,929评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,372评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,679评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,837评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,536评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,168评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,886评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,129评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,665评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,739评论 2 351

推荐阅读更多精彩内容