现在es6的推进和普及大大提高了现在js的编程效率,但是在之前es5中更新的一些数组的操作方法,对我们在原生js中操作数组有着非常显著的提高,我们现在一起回顾一下es5中一些非常高效的数组方法

5个迭代方法:forEach()、map()、filter()、some()、every();

2个索引方法:indexOf() 和 lastIndexOf();

2个归并方法:reduce()、reduceRight();

迭代方法

1. forEach

  • 简介:

forEach 是es5中最基本也是目前用的非常多的一种数组方法,就是最基础的循环、遍历。让我们不用再无脑for循环

  • 语法:
array.forEach(callback);
复制代码
  • 示例
//遍历打印数组的value, index和数组本身
let arr = [1, 2, 3];
arr.froEach((value, index, arr) => {
    console.log(value, index, arr)
})
//1 0 [ 1, 2, 3 ]
//2 1 [ 1, 2, 3 ]
//3 2 [ 1, 2, 3 ]
复制代码

2.map

  • 简介:

map() 是一种映射方法,对数组中的每一项运行指定的函数,并且返回函数每次调用的结果所组成的数组。用map可以对数组的

  • 语法:
array.map(callback,[ thisObject]);
复制代码
  • 示例
//对数组的每一项进行双倍处理,并返回新的数组
let arr2 = [2,4,6];
let sum2 = arr2.map((value,index,arr) => {
  return value += value;
});
console.log(sum2);  // [4, 8, 12] 
复制代码

###3.filter

  • 简介:

filter() 是一种过滤方法,对数组中的每一项进行对应函数规则的筛选,并返回新的数组,用法和map()非常相似

  • 语法:
array.filter(callback,[ thisObject]);
复制代码
  • 示例
//对数组的每一项进行筛选,并返回能够被3整除的项
let arr3 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
let flag = arr3.filter((value, index) => {
  return value % 3 === 0;
}); 
console.log(flag);  // [3, 6, 9]
复制代码

4.some

  • 简介

some() 判断数组中是否存在满足条件的项,只要有一项满足条件,就会返回true。

  • 语法
array.some(callback,[ thisObject]);
复制代码
  • 示例
//用some()来判断一个数组中的每项是否含有偶数:
var arr5 = [1, 2, 3, 4, 5];
var flag = arr5.some(function(value, index) {
  return value % 2 === 0;
}); 
console.log(flag);   // true
复制代码

5.every

  • 简介:

filter() 判断数组中每一项都是否满足所给条件,当所有项都满足条件,才会返回true。

  • 语法:
array.every(callback,[ thisObject]);
复制代码
  • 示例
//用every()来判断一个数组中的每项是否都是偶数:
var arr4 = [1, 2, 3, 4, 5];
var flag = arr4.every(function(value, index) {
  return value % 2 === 0;
}); 
console.log(flag);  // false
复制代码

索引方法

indexOf() 和 lastIndexOf()

这两个方法都接收两个参数,第一个参数是要查找的项,第二个参数是查找项起点位置的索引,该参数可选,如果缺省或是格式不正确,那么默认为0。

两个方法都返回查找项在数组中的位置,如果没有找到,那么返回-1。区别就是一个从前往后找,一个从后往前找。意思就是第二个参数是你立的一个flag,一个往flag右边找,一个往flag左边找。

indexOf

  • 简介

indexOf(),返回查找项的整数索引值,如果没有匹配(严格匹配),返回-1。这个方法与字符串方法ndexOf()的功能是一样的,不过是对数组的操作而已。

  • 语法
array.indexOf(searchElement[, fromIndex])
复制代码
  • 示例
var arr6 = [1, 3, 5, 3, 5];
console.log(arr6.indexOf(5, 'x'));  // 2 ('x'被忽略)
console.log(arr6.indexOf('5', 3));  // -1 (未找到,因为5 !== '5')
console.log(arr6.indexOf(5, '3'));  // 4 (从3号位开始向后搜索)
console.log(arr6.indexOf(5, 3));  // 4 (从3号位开始向后搜索)
console.log(arr6.indexOf(4));  // -1 (未找到)
复制代码

lastIndexOf

lastIndexOf()IndexOf()类似,只是lastIndexOf()是从字符串的末尾开始查找,而不是从开头。

var arr7 = [1, 3, 5, 3, 5];
console.log(arr7.lastIndexOf(5));  // 4
console.log(arr7.lastIndexOf(3));  // 3
console.log(arr7.lastIndexOf(1));  // 0
console.log(arr7.lastIndexOf(5, '3'));  // 2 (从3号位开始向前搜索)
console.log(arr7.lastIndexOf(5, 3));  // 2 (从3号位开始向前搜索)
console.log(arr7.lastIndexOf(4));  // -1 (未找到)
复制代码

归并方法

reduce()和reduceRight()

这两个方法相比前面可能稍微复杂一些,它们都会迭代数组中的所有项,然后生成一个最终返回值。它中文直译是缩减,应该是随着运算项数在递减,就类似于归并,迭代。

接收两个参数,第一个参数callback,函数接受4个参数分别是(初始值total必选,当前值currentValue必选,索引值currentIndex可选,和当前数组arr可选),函数需要返回一个值,这个值会在下一次迭代中作为初始值。第二个参数是迭代初始值(initialValue),参数可选,如果缺省,初始值为数组第一项,从数组第一个项开始叠加,缺省参数要比正常传值少一次运算。

reduce

  • 简介

reduce() 方法接收一个函数作为累加器,数组中的每个值(从左到右)开始缩减,最终计算为一个值。注意: reduce() 对于空数组是不会执行回调函数的。

  • 语法
array.reduce(callback[, initialValue])
复制代码
  • 示例
var arr9 = [1, 2, 3, 4];
var sum9 =arr9.reduce(function (total, curr, index, array) {
  return total * curr;
});
console.log(sum9);  // 24 
var sum9_1 =arr9.reduce(function (total, curr, index, array) {
  return total * curr;
}, 10);
console.log(sum9_1);  // 240
复制代码

sum9中因为initialValue不存在,因此一开始的total值等于数组的第一个元素。从而curr值在第一次调用的时候就是2。

sum9_1,有了initialValue,就在第一次相乘时是10*2。

下面是一个二维数组扁平化的例子,感觉最近看书。视频还有和小伙伴聊天各种扁平化,组件数组方法……解耦不继承,那就……扁平化吧:

var matrix = [
  [1, 2],
  [3, 4],
  [5, 6]
];
var flatten = matrix.reduce(function (previous, current) {
  return previous.concat(current);
});
console.log(flatten); // [1, 2, 3, 4, 5, 6]
复制代码

concat()方法是拼接数组的,会在下篇文章中详细讲到。我……争取早日写完,最近项目忙到原地炸裂,但学习效率却显著提高,每天地铁和午饭听个node视频都津津有味的。越忙越珍惜吧,呀,扯远了……回来!

reduceRight

reduceRight()和reduce()相比,用法类似,差异在于reduceRight是从数组的末尾开始实现的。来做个简单的减法:

var arr9 = [2, 45, 30, 80];
var flag = arr9.reduceRight(function (total, curr, index) {
  return total - curr;
});
var flag_1 = arr9.reduceRight(function (total, curr, index) {
  return total - curr;
},200);
console.log(flag);  // 3
console.log(flag_1);  // 43
复制代码