调用处理函数后,返回新数组,不改变原数组,且若是数组是稀疏的,返回的新数组也是稀疏的。 数组
上例子: 函数
var a = [1, 2, 3]; var b = a.map(function(x) { return x * x; }); b // [1, 4 ,9]
数组元素筛选,处理函数是用来作逻辑判断的,就是若是return true就返回当前的元素值,不然啥也不作,接着筛下1个。注意的一点就是,对于稀疏数组,缺乏的元素会自动跳过。 spa
例1,常规数组 code
var a = [5, 4, 3, 2, 1]; var smallvalues = a.filter(function(x) { return x<3;}); var everyother = a.filter(function(i) { return i % 2 ==0}); smallvalues // [2, 1] everyother // [4, 2]例2,稀疏数组的状况
var sparse = [5, 4, 3, 2, 1]; delete sparse[3]; sparse // [5, 4, 3, , 1]
var dense = sparse.filter(function() { return true; }); // [5, 4, 3, 1]
例子3,手工筛掉 undefined与null 对象
var a= [5, null, 3, undefined, 1]; var b = a.filter(function(x) { return x !== undefined && x !=null; }); b // [5, 3, 1]
函数返回true或者false 索引
遍历数组,若是处理函数中有一项判断return true,则函数停止some()的返回值为true。若是有任意一项return false,则函数停止every()返回false ip
例子 字符串
var a = [1, 2, 3, 4, 5]; // 全部为true,才是true a.every(function(x) { return x < 10; }) // true a.every(function(x) { return x > 1; }) // false // 1项为false,就是false a.every(function(x) { return x < 3; }) // false a.every(function(x) { return x < 2; }) // false // 全部为false,才是false a.some(function(x) { return x > 10; }) // false a.some(function(x) { return x > 3; }) // true // 1项为true,就是true a.some(function(x) { return x < 3; }) // true a.some(function(x) { return x > 4; }) // true
a.some(isNaN); // false,a里不包含非数值元素
// 下面这两个特殊状况 [].every(function(){}); // true [].some(function(){}); // false
函数返回1个值,若是不指定初始默认值,则数组的第1个元素为初始默认值 io
var a = [1, 2, 3, 4, 5]; var sum = a.reduce(function(x, y) { return x+y; }, 0); // 15,x的初值是0 var product = a.reduce(function(x, y) { return x*y; }, 1); // 120,x的初值是1 var max = a.reduce(function(x ,y) { return (x>y)?x:y; }); // 5,没指定初值,x为1
reduceRight只是顺序变了 ast
var a = [2, 3, 4]; var big = a.reduceRight(function(a, b) { return Math.pow(b,a); }); // 2.4178516392292583e+24 var big = a.reduce(function(a, b) { return Math.pow(b,a); }); // 262144
将对象数组中的对象组合成1个对象
function extend(o, p) { for (prop in p) { o[prop] = p[prop]; } return o; } function union(o, p) { return extend(extend({}, o), p); } var objects = [{x: 1}, {y: 2}, {z: 3}]; var merged = objects.reduce(union); // Object {x: 1, y: 2, z: 3}
与字符串的办法类似,在数组中搜索指定值,只是搜索的方向不同,返回第1个匹配值的索引,没找到就返回-1
var a = [0, 1, 2, 1, 0]; a.indexOf(1); // 1 a.lastIndexOf(1); //3 a.indexOf(3); // -1,没找到
在数组中查找元素,返回全部的查找到元素的索引
function findall(a, x) { var results = [], len = a.length, pos =0; while(pos <len) { pos = a.indexOf(x, pos); // 指定偏移量 if(pos == -1) break; results.push(pos); pos = pos +1; } return results; }
findall(a, 1); // [1, 3]