ECMAScript5标准发布于2009年12月3日,它带来了一些新的,改善现有的Array数组操做的方法。
若是不考虑兼容性的话能够大面积使用了。javascript
在ES5中,Array一共有10个方法:java
Array.isArray 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
Array.isArray() 方法用来判断某个值是否为数组。若是是,则返回 true,不然返回 false数组
// 下面的函数调用都返回 true Array.isArray([]); Array.isArray([1]); Array.isArray(new Array()); // 不为人知的事实:其实 Array.prototype 也是一个数组。 Array.isArray(Array.prototype); // 下面的函数调用都返回 false Array.isArray(); Array.isArray({}); Array.isArray(null); Array.isArray(undefined); Array.isArray(17); Array.isArray('Array'); Array.isArray(true); Array.isArray(false); Array.isArray({ __proto__: Array.prototype });
具体参考MDNapp
indexOf
方法返回元素在数组中的第一个位置的索引,若是不存在返回"-1"函数
不使用indexOf
时:es5
var arr = ['apple','orange','pear'], found = false; for(var i = 0, length = arr.length; i < length; i++) { if (arr[i] === 'orange') { found = true; } } console.log('found orange :' + found);
使用indexOf
方法后:prototype
var arr = ['apple','orange','pear']; console.log('found orange : ', arr.indexOf('orange') != -1);
filter方法建立一个一个新的匹配过滤条件的数组,返回数组的一个子集,回调函数用于逻辑判断是否返回,返回true则把当前元素加入到返回数组中,false则不加,新数组只包含返回true的值,索引缺失的不包括,原数组保持不变.code
var arr = new Array(1, 2, 3, 4, 5, 6); var newArr = arr.filter(function(e){ return e % 2 == 0; }); console.log(newArr); // [ 2, 4, 6 ] console.log(arr); //[1, 2, 3, 4, 5, 6]
再举个例子,不使用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后:ip
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);
遍历数组,参数为一个回调函数,回调函数有三个参数:当前元素,元素索引,整个数组。
为每个元素执行对应的回调方法。 forEach
是用来替换 for
、和 for in
循环的。
var arr = [1,2,3,4,5,6,7,8]; // 普通for循环 for(var i= 0, l = arr.length; i< l; i++){ console.log(arr[i]); } // forEach 迭代 arr.forEach(function(item,index){ console.log(item); }); // 给数组中的每一个元素加1 var a = new Array(1, 2, 3, 4, 5, 6); a.forEach(function(e, i, array) { array[i] = e + 1; }); console.log(a); //[2, 3, 4, 5, 6, 7]
map()
对数组的每一个元素进行必定操做(映射)后,会返回一个新的数组。
与forEach
相似,遍历数组,回调函数的返回值组成一个新的数组,新数组的索引结构和原数组一致,原数组保持不变。
不使用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()); // 再举个例子: var a = new Array(1, 2, 3, 4, 5, 6); var newArr = a.map(function(e) { return e * e; }); console.log(newArr); // [1, 4, 9, 16, 25, 36] console.log(a); //[1, 2, 3, 4, 5, 6]
reduce()
能够实现一个累加器的功能,将数组的每一个值(从左到右)将其下降到一个值。
遍历数组,调用回调函数,将数组元素组合成一个值返回
,
reduce从索引最小值开始,reduceRight反向,方法有两个参数。
举个例子:
var a = new Array(1, 2, 3, 4, 5, 6); var a2 = a.reduce(function(v1, v2) { return v1 + v2; }); var a3 = a.reduceRight(function(v1, v2) { return v1 - v2; }, 100); console.log(a2); // 21 console.log(a3); // 79
再举个例子: 统计一个数组中每一个单词出现的次数。
不使用 .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()); // { apple: 2, orange: 3, pear: 1 }
使用.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()); // { apple: 2, orange: 3, pear: 1 }
最后再来一个例子, 加深理解传递初始值和不传初始值的区别:
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());