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 相关文章推荐
window.opener用法和用途实例介绍
Aug 19 Javascript
调试代码导致IE出错的避免方法
Apr 04 Javascript
JavaScript中使用Callback控制流程介绍
Mar 16 Javascript
JavaScript数据类型详解
Apr 01 Javascript
JavaScript中的splice()方法使用详解
Jun 09 Javascript
jquery实现图片预加载
Dec 25 Javascript
一个可复用的vue分页组件
May 15 Javascript
vue+axios实现登录拦截的实例代码
May 22 Javascript
代码详解JS操作剪贴板
Feb 11 Javascript
详解JavaScript中typeof与instanceof用法
Oct 24 Javascript
js实现图片无缝循环轮播
Oct 28 Javascript
微信小程序实现转盘抽奖
Sep 21 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版
2006/10/09 PHP
php5.2.0内存管理改进
2007/01/22 PHP
PHP中mysql_field_type()函数用法
2014/11/24 PHP
PHP获取远程图片并保存到本地的方法
2015/05/12 PHP
thinkphp 框架数据库切换实现方法分析
2020/05/18 PHP
两种WEB下的模态对话框 (asp.net或js的分别实现)
2009/12/02 Javascript
javascript setTimeout()传递函数参数(包括传递对象参数)
2010/04/07 Javascript
JavaScript高级程序设计阅读笔记(十六) javascript检测浏览器和操作系统-detect.js
2012/08/14 Javascript
javascript检测对象中是否存在某个属性判断方法小结
2013/05/19 Javascript
JS解决ie6下png透明的方法实例
2013/08/02 Javascript
Javascript自定义函数判断网站访问类型是PC还是移动终端
2014/01/10 Javascript
Jquery实现瀑布流布局(备有详细注释)
2015/07/31 Javascript
JavaScript的new date等日期函数在safari中遇到的坑
2016/10/24 Javascript
jQuery仿写百度百科的目录树
2017/01/03 Javascript
快速搭建React的环境步骤详解
2017/11/06 Javascript
vue根据进入的路由进行原路返回的方法
2018/09/26 Javascript
Vue源码之关于vm.$delete()/Vue.use()内部原理详解
2019/05/01 Javascript
使用layui+ajax实现简单的菜单权限管理及排序的方法
2019/09/10 Javascript
解决layui页面按钮点击无反应,也不报错的问题
2019/09/29 Javascript
JS localStorage存储对象,sessionStorage存储数组对象操作示例
2020/02/15 Javascript
vue框架中props的typescript用法详解
2020/02/17 Javascript
Vue如何提升首屏加载速度实例解析
2020/06/25 Javascript
在vue中给后台接口传的值为数组的格式代码
2020/11/12 Javascript
Python中的rjust()方法使用详解
2015/05/19 Python
python3抓取中文网页的方法
2015/07/28 Python
Python装饰器实现几类验证功能做法实例
2017/05/18 Python
实践Vim配置python开发环境
2018/07/02 Python
Python 字符串转换为整形和浮点类型的方法
2018/07/17 Python
pygame游戏之旅 添加键盘按键的方法
2018/11/20 Python
python linecache 处理固定格式文本数据的方法
2019/01/08 Python
用vue.js组件模拟v-model指令实例方法
2019/07/05 Python
Python sqlalchemy时间戳及密码管理实现代码详解
2020/08/01 Python
会员卡清退活动总结
2014/08/27 职场文书
Python尝试实现蒙特卡罗模拟期权定价
2022/04/21 Python
MySQL解决Navicat设置默认字符串时的报错问题
2022/06/16 MySQL
windows server2012 R2下安装PaddleOCR服务的的详细步骤
2022/09/23 Servers