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 相关文章推荐
用javascript控制iframe滚动的代码
Apr 10 Javascript
js 兼容多浏览器的回车和鼠标焦点事件代码(IE6/7/8,firefox,chrome)
Apr 14 Javascript
ASP.NET jQuery 实例16 通过控件CustomValidator验证RadioButtonList
Feb 03 Javascript
关于JS管理作用域的问题
Apr 10 Javascript
javascript使用正则获取url上的某个参数
Sep 04 Javascript
JS动态创建DOM元素的方法
Jun 09 Javascript
JavaScript实现相册弹窗功能(zepto.js)
Jun 21 Javascript
利用JS实现简单的日期选择插件
Jan 23 Javascript
node.js爬虫爬取拉勾网职位信息
Mar 14 Javascript
给localStorage设置一个过期时间的方法分享
Nov 06 Javascript
详解vue中使用protobuf踩坑记
May 07 Javascript
Electron实现应用打包、自动升级过程解析
Jul 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
PHP 5.0对象模型深度探索之绑定
2006/09/05 PHP
php简单压缩css样式示例
2016/09/22 PHP
thinkPHP5.0框架配置格式、加载解析与读取方法
2017/03/17 PHP
PHP数据库操作四:mongodb用法分析
2017/08/16 PHP
网页中实现浏览器的最大,最小化和关闭按钮
2007/03/12 Javascript
JQuery 1.4 中的Ajax问题
2010/01/23 Javascript
6个DIV 135或246间隔一秒轮番显示效果
2010/07/24 Javascript
当json键为数字时的取值方法解析
2013/11/15 Javascript
javascript实现checkBox的全选,反选与赋值
2015/03/12 Javascript
JS实现带提示的星级评分效果完整实例
2015/10/30 Javascript
解决js函数闭包内存泄露问题的办法
2016/01/25 Javascript
简单谈谈javascript中this的隐式绑定
2016/02/22 Javascript
bootstrap导航条实现代码
2016/12/28 Javascript
原生js仿浏览器滚动条效果
2017/03/02 Javascript
vue2项目使用sass的示例代码
2017/06/28 Javascript
Vue.js实例方法之生命周期详解
2017/07/03 Javascript
vue 添加vux的代码讲解
2017/11/30 Javascript
Element DateTimePicker日期时间选择器的使用示例
2020/07/27 Javascript
Python操作sqlite3快速、安全插入数据(防注入)的实例
2014/04/26 Python
python实现域名系统(DNS)正向查询的方法
2016/04/19 Python
Python利用正则表达式实现计算器算法思路解析
2018/04/25 Python
Python读取本地文件并解析网页元素的方法
2018/05/21 Python
python 获取微信好友列表的方法(微信web)
2019/02/21 Python
Python使用__new__()方法为对象分配内存及返回对象的引用示例
2019/09/20 Python
详解pandas中利用DataFrame对象的.loc[]、.iloc[]方法抽取数据
2020/12/13 Python
Python爬取网站图片并保存的实现示例
2021/02/26 Python
使用CSS3的appearance属性改变任何元素的浏览器默认风格
2012/12/24 HTML / CSS
关于html字符串正则判断和匹配的具体使用
2019/12/12 HTML / CSS
苹果中国官方网站:Apple中国
2016/07/22 全球购物
JSF如何进行表格处理及取值
2012/08/06 面试题
毕业生就业自荐书
2013/12/15 职场文书
小学少先队活动方案
2014/02/18 职场文书
公司2014年度工作总结
2014/12/10 职场文书
2016党校学习心得体会范文
2016/01/07 职场文书
详细介绍MySQL中limit和offset的用法
2022/05/06 MySQL
JavaScript实现简单的音乐播放器
2022/08/14 Javascript