5个数组Array方法: indexOf、filter、forEach、map、reduce使用实例


Posted in Javascript onJanuary 29, 2015

ECMAScript5标准发布于2009年12月3日,它带来了一些新的,改善现有的Array数组操作的方法。然而,这些新奇的数组方法并没有真正流行起来的,因为当时市场上缺乏支持ES5的浏览器。

Array "Extras"

没有人怀疑这些方法的实用性,但写polyfill(PS:兼容旧版浏览器的插件)对他们来说是不值得的。它把“必须实现”变成了“最好实现”。有人居然将这些数组方法称之为Array "Extras"。哎!

但是,时代在变化。如果你看看Github上流行的开源JS项目,你会发现趋势正在转变。大家都想削减大量(第三方库)的依赖,仅用本地代码来实现。

好了,让我们开始吧。

我的5个数组

在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

我将挑选5种方法,我个人认为是最有用的,很多开发者都会碰到。

1) indexOf

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

不使用indexOf时

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);

使用后

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

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

2) filter

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

不用 filter() 时

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);

3) forEach()

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

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

// Uses the usual "for" loop to iterate
for(var i= 0, l = arr.length; i< l; i++){
console.log(arr[i]);
}

console.log("========================");

//Uses forEach to iterate
arr.forEach(function(item,index){
console.log(item);
});

forEach是用来替换for循环的

4) map()

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

不使用map

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()是处理服务器返回数据时是一个非常实用的函数。

5) reduce()

reduce()可以实现一个累加器的功能,将数组的每个值(从左到右)将其降低到一个值。

说实话刚开始理解这句话有点难度,它太抽象了。

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

不使用reduce时

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()后

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

function getWordCnt(){
  return arr.reduce(function(prev,next){
    prev[next] = (prev[next] + 1) || 1;
    return prev;
  },{});
}

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());
Javascript 相关文章推荐
js数组的操作详解
Mar 27 Javascript
Javascript单元测试框架QUnitjs详细介绍
May 08 Javascript
jQuery的css() 方法使用指南
May 03 Javascript
jQuery实现美观的多级动画效果菜单代码
Sep 06 Javascript
IE8 内存泄露(内存一直增长 )的原因及解决办法
Apr 06 Javascript
Angular工具方法学习
Dec 26 Javascript
Vuejs仿网易云音乐实现听歌及搜索功能
Mar 30 Javascript
Vue路由切换时的左滑和右滑效果示例
May 29 Javascript
怎样在vue项目下添加ESLint的方法
May 16 Javascript
详解从vue-loader源码分析CSS Scoped的实现
Sep 23 Javascript
layui多图上传实现删除功能的例子
Sep 23 Javascript
微信小程序canvas开发水果老虎机的思路详解
Feb 07 Javascript
推荐一个自己用的封装好的javascript插件
Jan 29 #Javascript
js实现点击左右按钮轮播图片效果实例
Jan 29 #Javascript
JavaScript中实现继承的三种方式和实例
Jan 29 #Javascript
javascript面向对象程序设计(一)
Jan 29 #Javascript
jquery调取json数据实现省市级联的方法
Jan 29 #Javascript
JavaScript中实现单体模式分享
Jan 29 #Javascript
angular简介和其特点介绍
Jan 29 #Javascript
You might like
Save a File Using a File Save Dialog Box
2007/06/18 Javascript
JavaScript中使用正则匹配多条,且获取每条中的分组数据
2010/11/30 Javascript
JavaScript等比例缩放图片控制超出范围的图片
2013/08/06 Javascript
jQuery教程 $()包装函数来实现数组元素分页效果
2013/08/13 Javascript
jQuery UI 实现email输入提示实例
2013/08/15 Javascript
js、css、img等浏览器缓存问题的2种解决方案
2013/10/23 Javascript
jquery中ajax函数执行顺序问题之如何设置同步
2014/02/28 Javascript
用C/C++来实现 Node.js 的模块(一)
2014/09/24 Javascript
javascript排序函数实现数字排序
2015/06/26 Javascript
全面解析Bootstrap表单使用方法(表单样式)
2015/11/24 Javascript
javascript实现倒计时跳转页面
2016/01/17 Javascript
深入浅析JavaScript中的作用域和上下文
2016/03/26 Javascript
js判断radiobuttonlist的选中值显示/隐藏其它模块的实现方法
2016/08/25 Javascript
概述VUE2.0不可忽视的很多变化
2016/09/25 Javascript
ajax接收后台数据在html页面显示
2017/02/19 Javascript
jQuery md5加密插件jQuery.md5.js用法示例
2018/08/24 jQuery
vue中的watch监听数据变化及watch中各属性的详解
2018/09/11 Javascript
JavaScript中变量提升机制示例详解
2019/12/27 Javascript
如何在node环境实现“get数据解析”代码实例
2020/07/03 Javascript
react中hook介绍以及使用教程
2020/12/11 Javascript
Python实现全排列的打印
2018/08/18 Python
python 处理string到hex脚本的方法
2018/10/26 Python
Python程序打包工具py2exe和PyInstaller详解
2019/06/28 Python
Python GUI自动化实现绕过验证码登录
2020/01/10 Python
python UIAutomator2使用超详细教程
2021/02/19 Python
在家更换处方镜片:Lensabl
2019/05/01 全球购物
德国玩具商店:Planet Happy DE
2021/01/16 全球购物
外语专业毕业生自荐信
2014/04/14 职场文书
大学新闻系求职信
2014/06/03 职场文书
国际语言毕业生求职信
2014/07/08 职场文书
2014年乡镇领导个人整改措施
2014/09/19 职场文书
会议接待欢迎标语
2014/10/08 职场文书
2015年党风廉政建设责任书
2015/01/29 职场文书
社区六一儿童节活动总结
2015/02/11 职场文书
2015年社区国庆节活动总结
2015/07/30 职场文书
「睡美人」爱洛公主粘土人开订
2022/03/22 日漫