調用處理函數後,返回新數組,不改變原數組,且若是數組是稀疏的,返回的新數組也是稀疏的。 數組
上例子: 函數
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]