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 相关文章推荐
jquery批量控制form禁用的代码
Aug 06 Javascript
javascript列表框操作函数集合汇总
Nov 28 Javascript
jQuery 获取、设置HTML或TEXT内容的两种方法
May 23 Javascript
基于jQuery实现select下拉选择可输入附源码下载
Feb 03 Javascript
TypeScript学习之强制类型的转换
Dec 27 Javascript
web打印小结
Jan 11 Javascript
详解vue.js 开发环境搭建最简单攻略
Jun 12 Javascript
IScroll那些事_当内容不足时下拉刷新的解决方法
Jul 18 Javascript
JavaScript复制内容到剪贴板的两种常用方法
Feb 27 Javascript
vue项目使用.env文件配置全局环境变量的方法
Oct 24 Javascript
jQuery加PHP实现图片上传并提交的示例代码
Jul 16 jQuery
解决elementui表格操作列自适应列宽
Dec 28 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
通过ODBC连接的SQL SERVER实例
2006/10/09 PHP
用PHP的ob_start();控制您的浏览器cache!
2007/02/14 PHP
php入门小知识
2008/03/24 PHP
WordPress中用于获取文章信息以及分类链接的函数用法
2015/12/18 PHP
javascript 面向对象继承
2009/11/26 Javascript
DIV外区域Click后关闭DIV的实现代码
2011/12/21 Javascript
js图片卷帘门导航菜单特效代码分享
2015/09/10 Javascript
jQuery简单实现MD5加密的方法
2017/03/03 Javascript
基于vue的fullpage.js单页滚动插件
2017/03/20 Javascript
AngularJS路由删除#符号解决的办法
2017/09/28 Javascript
jQuery结合jQuery.cookie.js插件实现换肤功能示例
2017/10/14 jQuery
vue自定义底部导航栏Tabbar的实现代码
2018/09/03 Javascript
微信小程序实现订单倒计时
2020/11/01 Javascript
JavaScript剩余操作符Rest Operator详解
2019/07/20 Javascript
vue 对axios get pust put delete封装的实例代码
2020/01/05 Javascript
基于vue和websocket的多人在线聊天室
2020/02/01 Javascript
ES6中Set和Map用法实例详解
2020/03/02 Javascript
js获取url页面id,也就是最后的数字文件名
2020/09/25 Javascript
解决vue中使用less/sass及使用中遇到无效的问题
2020/10/24 Javascript
Python深入学习之上下文管理器
2014/08/31 Python
python如何将图片转换为字符图片
2020/08/19 Python
python使用numpy读取、保存txt数据的实例
2018/10/14 Python
python简单验证码识别的实现方法
2019/05/10 Python
使用Python计算玩彩票赢钱概率
2019/06/26 Python
Python range、enumerate和zip函数用法详解
2019/09/11 Python
python之pymysql模块简单应用示例代码
2019/12/16 Python
纯CSS3实现的井字棋游戏
2020/11/25 HTML / CSS
HTML5 canvas 基本语法
2009/08/26 HTML / CSS
Toppik顶丰增发纤维官网:解决头发稀疏
2017/12/30 全球购物
ORLY官网:美国专业美甲一线品牌
2019/12/11 全球购物
木马的传播途径主要有哪些
2016/04/08 面试题
升职自荐信怎么写
2015/03/05 职场文书
2015年教师教学工作总结
2015/04/28 职场文书
2015年六年级班主任工作总结
2015/10/15 职场文书
Python如何使用logging为Flask增加logid
2021/03/30 Python
python实现网络五子棋
2021/04/11 Python