在JavaScript中巧用函数处理数组

作者:admin     字体:[增加 减小]    类型:原创
在JavaScript中可以使用数组方法map、reduce、foreach、filter来处理数组,而不是像以前那样重复使用循环语句,本文以一下求均方差的实例来讲解此用法。

假设有一个数组,数组元素都是数字,我们想要计算这些元素的平均值和标准差,可以使用数组方法map()和reduce()来实现此计算,这种实现极其简洁:

var data = [1,1,3,5,5];

//首先定义两个简单的函数
var sum = function(x,y){return x+y;}
var square = function(x){return x*x;};

//然后将这些函数和数组方法配合使用计算出平均数和标准差
var mean = data.reduce(sum)/data.length;
var deviations = data.map(function(x){return x-mean});
var stddev = Math.sqrt(deviations.map(square).reduce(sum)/(data.length-1));
console.log(stddev);

如果数组中没有map与reduce方法,我们可以先写出这两个函数,再利用函数式编程方法处理数组

var map = function(a,f){
    var results = [];
    for(var i=0,len=a.length;i<len;i++){
        if(i in a) results[i] = f.call(null,a[i],i,a);
    }
    return results;
}

var reduce = function(a,f,initial){
    var i=0,len = a.length,accumulator;
    if(arguments.length>2) accumulator = initial;
    else {
        if (len==0) throw TypeError();
        while(i<len){
            if (i in a){
                accumulator = a[i++];
                break;
            }
            else i++;
        }
        if (i==len) throw TypeError();
    }
    while(i<len){
        if (i in a)
            accumulator = f.call(undefined,accumulator,a[i],i,a);
        i++;
    }
    return accumulator;
}

接下来,我们可以这样写

var data = [1,1,3,5,5];

//首先定义两个简单的函数
var sum = function(x,y){return x+y;};
var square = function(x){return x*x;};

var mean = reduce(data,sum)/data.length;
var deviations = map(data,function(x){return x-mean;});
var stddev = Math.sqrt(reduce(map(deviations,square),sum)/(data.length-1));
console.log(stddev);