数组的方法 之 ECMAScript 5 部分
2. map(处理函数)
调用处理函数后,返回新数组,不改变原数组,且如果数组是稀疏的,返回的新数组也是稀疏的。
上例子:
var a = [1, 2, 3];
var b = a.map(function(x) {
return x * x;
});
b // [1, 4 ,9]
3. filter(处理函数)
数组元素筛选,处理函数是用来做逻辑判断的,就是如果return true就返回当前的元素值,否则啥也不做,接着筛下1个。注意的一点就是,对于稀疏数组,缺少的元素会自动跳过。
例1,常规数组
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]
4. every(处理函数) 和 some(处理函数)
函数返回true或者false
遍历数组,如果处理函数中有一项判断return true,则函数中止some()的返回值为true。如果有任意一项return false,则函数中止every()返回false
例子
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
5. reduce(函数, 初始默认值) 和 reduceRight(函数, 初始默认值)
函数返回1个值,如果不指定初始默认值,则数组的第1个元素为初始默认值
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只是顺序变了
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}
6. indexOf( 要搜索的值, 偏移量) 和 lastIndexOf(要搜索的值, 偏移量)
与字符串的办法相似,在数组中搜索指定值,只是搜索的方向不一样,返回第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]