废不多说, 先上代码:
/**
* 数组求和
* @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’]})
仅供学习.