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 相关文章推荐
多个iframe自动调整大小的问题
Sep 18 Javascript
Jquery 学习笔记(一)
Oct 13 Javascript
Javascript将string类型转换int类型
Dec 09 Javascript
JavaScript中几个重要的属性(this、constructor、prototype)介绍
May 19 Javascript
jQuery插件pagewalkthrough实现引导页效果
Jul 05 Javascript
JS排序方法(sort,bubble,select,insert)代码汇总
Jan 30 Javascript
Bootstrap 轮播(Carousel)插件
Dec 26 Javascript
详解原生js实现offset方法
Jun 15 Javascript
JavaScript实现为事件句柄绑定监听函数的方法分析
Nov 14 Javascript
详解微信小程序调起键盘性能优化
Jul 24 Javascript
详解Angular Forms中自定义ngModel绑定值的方式
Dec 10 Javascript
vue表单中遍历表单操作按钮的显示隐藏示例
Oct 30 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
PHP实现伪静态方法汇总
2016/01/13 PHP
一个简单的瀑布流效果(主体形式自写)
2013/05/27 Javascript
JAVASCRIPT模式窗口中下载文件无法接收iframe的流
2013/10/11 Javascript
jquery表单验证需要做些什么
2015/11/17 Javascript
jQuery javascript获得网页的高度与宽度的实现代码
2016/04/26 Javascript
自动化测试读写64位操作系统的注册表
2016/08/15 Javascript
AngularJS入门教程之REST和定制服务详解
2016/08/19 Javascript
localStorage的黑科技-js和css缓存机制
2017/02/06 Javascript
JavaScript中闭包的详解
2017/04/01 Javascript
NodeJS创建最简单的HTTP服务器
2017/05/15 NodeJs
Angular实现表单验证功能
2017/11/13 Javascript
详解VUE 对element-ui中的ElTableColumn扩展
2018/03/28 Javascript
js限制输入框只能输入数字(onkeyup触发)
2018/09/28 Javascript
详解webpack loader和plugin编写
2018/10/12 Javascript
发布Angular应用至生产环境的方法
2018/12/10 Javascript
详解vue的数据劫持以及操作数组的坑
2019/04/18 Javascript
jsonp跨域获取百度联想词的方法分析
2019/05/13 Javascript
详解vue 动态加载并注册组件且通过 render动态创建该组件
2019/05/30 Javascript
150行Node.js实现的dns代理工具
2019/08/02 Javascript
JavaScript通如何过RGraph实现动态仪表盘
2020/10/15 Javascript
python如何在列表、字典中筛选数据
2018/03/19 Python
python list转置和前后反转的例子
2019/08/26 Python
python之yield和Generator深入解析
2019/09/18 Python
使用CSS3制作饼状旋转载入效果的实例
2015/06/23 HTML / CSS
用Python匹配HTML tag的时候,<.*>和<.*?>有什么区别
2012/11/04 面试题
优秀中专生推荐信
2013/11/17 职场文书
文秘专业个人求职信
2013/12/22 职场文书
国际贸易个人求职信范文
2014/01/04 职场文书
电工工作职责范本
2014/02/22 职场文书
计生工作先进事迹
2014/08/15 职场文书
市场营销工作计划书
2014/09/15 职场文书
排球赛新闻稿
2015/07/17 职场文书
Python3中最常用的5种线程锁实例总结
2021/07/07 Python
Nginx使用Lua模块实现WAF的原理解析
2021/09/04 Servers
Python爬虫入门案例之爬取去哪儿旅游景点攻略以及可视化分析
2021/10/16 Python
原型和原型链 prototype和proto的区别详情
2021/11/02 Javascript