1.type类型字典
let obj={
sum: '求和',
avg: '平均',
max: '最大值',
min: '最小值',
stddev_pop: '标准差',
var_pop: '方差',
count: '计数',
count_distinct: '去重计数',
}
2.定义计算方法
summaryCount(arr, type = 'sum') {
let first = arr[0]
switch (type) {
case 'sum':
return this.getSum(arr)
case 'avg':
return arr.reduce((a, b) => Number(a) + Number(b)) / arr.length
case 'max':
return arr.reduce((prev, next) => {
return Math.max(Number(prev), Number(next))
}, first)
case 'min':
return arr.reduce((prev, next) => {
return Math.min(Number(prev), Number(next))
}, first)
case 'stddev_pop':
const n = arr.length
const mean = arr.reduce((acc, cur) => acc + cur, 0) / n
const diffsSquaredSum = arr.reduce((acc, cur) => acc + Math.pow(cur - mean, 2), 0)
const variance = diffsSquaredSum / n
const stdDev = Math.sqrt(variance)
return stdDev
case 'var_pop':
const avg = arr.reduce((sum, val) => sum + val, 0) / arr.length
const diffSquaredSum = arr.reduce((acc, val) => {
const diff = val - avg
return acc + diff * diff
}, 0)
return diffSquaredSum / arr.length
case 'count':
return arr.length
case 'count_distinct':
return arr.filter((item, index, arr) => arr.indexOf(item) === index).length
default:
return this.getSum(arr)
}
},
getSum(arr) {
return arr.reduce((prev, curr) => {
const value = Number(curr)
let cellValue = ''
if (!isNaN(value)) {
cellValue = prev + curr
} else {
cellValue = prev
}
return cellValue
}, 0)
},
3.使用
this.summaryCount([1,2,3,5,8,9,9,1,2,3],'avg')