js sum函数, 按数组中元素的某个属性求和

  废不多说, 先上代码:

/**
 * 数组求和
 * @example
 * // returns 11
 * [2,4,5].sum()
 * // returns 266
 * var arr = [
 *     {yu: 113, shu: 123, wai: 115, wu: 75, hua: 90, sheng: 100},
 *     {yu: 123, shu: 143, wai: 123, wu: 90, hua: 100, sheng: 100}
 * ]
 * arr.sum(it=>it.shu)
 * // returns 740
 * arr.sum(it=>it.yu + it.shu + it.wai)
 * // returns {yu: 236, shu: 266, wai:238}
 * arr.sum(['yu','shu','wai'])
 * @param {function|Array} [field] 求和条件
 * @returns {number|Object}
 */
Array.prototype.sum = function(field){
	var a = this;
    return typeof field==='function'?Array.prototype.reduce.call(a,function(c,v){
        return c += field(v);
    },0)
    :Array.isArray(field)?Array.prototype.reduce.call(field,function(c, v){
        c[v] = (c[v]||0) + Array.prototype.sum.call(a, function(it){ 
            return it[v];
        });
		return c;
    },{})
    :!field?Array.prototype.reduce.call(a,function(c,v){
        return c += v;
    },0):0;
}

这里提供一个简单的生成样例的工具, 可以直接生成 Object[]类型数据:

/**
 * 生成样例数组
 * @param {object} opts 配置 {length: 5, keys:[{name:'keyName', type:'number', max: 100, optional:[]}], getVal:function(){}}
 */
function birthObjArr(opts){
	var length = opts.length||6;
	var keys = opts.keys;
	var getVal = opts.getVal||function(key){
		var type = key.type || 'number'
		var optional = key.optional;
		var getOption = function(options){
			return options[Math.random()*options.length|0];
		}
		if(optional && Array.isArray(optional)){
			return getOption(optional);
		}
		switch(type){
			case 'number':
				var max = key.max || 100;
				var min = key.min || 0;
				return Math.floor(Math.random()*(max+min+1)-min);
				break;
		}
	}
	var isStrOrNum = function(o){
		return o===o+'' || o===+o;
	}
	var res = [];
	while(res.length < length){
		res.push(keys.reduce(function(c,v){
			c[isStrOrNum(v.name)?v.name:v] = getVal(v);
			return c;
		},{}));
	}
	return res;
}

使用方法 birthObjArr({keys:[‘yu’,‘shu’,‘wai’]})
仅供学习.

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值