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 相关文章推荐
各浏览器对link标签onload/onreadystatechange事件支持的差异分析
Apr 27 Javascript
javascript中局部变量和全局变量的区别详解
Feb 27 Javascript
JS实现兼容性较好的随屏滚动效果
Nov 09 Javascript
jQuery插件formValidator自定义函数扩展功能实例详解
Nov 25 Javascript
针对后台列表table拖拽比较实用的jquery拖动排序
Oct 10 Javascript
解析jQueryEasyUI的使用
Nov 22 Javascript
jQuery Checkbox 全选 反选的简单实例
Nov 29 Javascript
vue 项目如何引入微信sdk接口的方法
Dec 18 Javascript
JS实现点击复选框变更DIV显示状态的示例代码
Dec 18 Javascript
Bootstrap 时间日历插件bootstrap-datetimepicker配置与应用小结
May 28 Javascript
layui 对弹窗 form表单赋值的实现方法
Sep 04 Javascript
原生js实现滑块区间组件
Jan 20 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
DOTA2 玩家自创拉野攻略 特色英雄快速成长篇
2020/04/20 DOTA
用PHP查询域名状态whois的类
2006/11/25 PHP
Apache启动报错No space left on device: AH00023该怎么解决
2015/10/16 PHP
php实现base64图片上传方式实例代码
2017/02/22 PHP
PHP实现数组转JSon和JSon转数组的方法示例
2018/06/14 PHP
jQuery中before()方法用法实例
2014/12/25 Javascript
jQuery实现页面滚动时动态加载内容的方法
2015/03/20 Javascript
AngularJS实现textarea记录只能输入规定数量的字符并显示
2016/04/26 Javascript
BootStrap selectpicker
2016/06/20 Javascript
JavaScript数组去重由慢到快由繁到简(优化篇)
2016/08/26 Javascript
将JSON字符串转换成Map对象的方法
2016/11/30 Javascript
angular.js+node.js实现下载图片处理详解
2017/03/31 Javascript
3分钟掌握常用的JS操作JSON方法总结
2017/04/25 Javascript
JS实现商品筛选功能
2020/08/19 Javascript
js事件委托和事件代理案例分享
2017/07/25 Javascript
Vue+Element使用富文本编辑器的示例代码
2017/08/14 Javascript
p5.js入门教程之平滑过渡(Easing)
2018/03/16 Javascript
微信小程序实现的一键复制功能示例
2019/04/24 Javascript
JS使用H5实现图片预览功能
2019/09/30 Javascript
微信小程序swiper实现文字纵向轮播提示效果
2020/01/21 Javascript
详细解析Python中的变量的数据类型
2015/05/13 Python
Python中getattr函数和hasattr函数作用详解
2016/06/14 Python
用python 批量更改图像尺寸到统一大小的方法
2018/03/31 Python
TensorFlow实现随机训练和批量训练的方法
2018/04/28 Python
值得收藏的10道python 面试题
2019/04/15 Python
django admin.py 外键,反向查询的实例
2019/07/26 Python
python 字符串常用函数详解
2019/09/11 Python
用python爬取历史天气数据的方法示例
2019/12/30 Python
pytorch 模拟关系拟合——回归实例
2020/01/14 Python
python实现跨年表白神器--你值得拥有
2021/01/04 Python
CSS3 开发工具收集
2010/04/17 HTML / CSS
纯css3实现照片墙效果
2014/12/26 HTML / CSS
凯普林包包西班牙官网:Kipling西班牙
2019/04/12 全球购物
英国买鞋网站:Charles Clinkard
2019/11/14 全球购物
国际商务专业职业生涯规划书范文
2014/01/17 职场文书
MySQL数据库查询之多表查询总结
2022/08/05 MySQL