数组聚合计算
a-calc 提供了一组数组聚合函数,用于对数据数组进行批量计算。在处理订单、报表、统计等场景时,它们能大大简化代码并提供精确的计算结果。
函数概览
| 函数 | 说明 | 示例 |
|---|---|---|
calc_sum | 求和 | 订单总金额、工资总支出 |
calc_avg | 平均值 | 平均成绩、平均单价 |
calc_max | 最大值 | 最高分、最大订单金额 |
calc_min | 最小值 | 最低分、最小库存 |
calc_count | 计数 | 统计有效数据数量 |
基本语法
所有聚合函数共享相同的调用方式:
javascript
import { calc_sum, calc_avg, calc_max, calc_min, calc_count } from 'a-calc'
// 基本调用
calc_sum(expression, dataArray)
calc_avg(expression, dataArray)
calc_max(expression, dataArray)
calc_min(expression, dataArray)
calc_count(expression, dataArray)expression:计算表达式,可包含格式化指令dataArray:数据对象数组
calc_sum - 求和
对数组中每个元素计算表达式,然后求和:
javascript
const items = [
{ value: 10 },
{ value: 20 },
{ value: 30 }
]
calc_sum('value', items) // '60'
// 表达式计算后求和
calc_sum('a * b', [
{ a: 2, b: 3 },
{ a: 4, b: 5 }
]) // '26' (6 + 20)
// 带格式化
calc_sum('price | =2', items) // '60.00'calc_avg - 平均值
对数组中每个元素计算表达式,然后求平均值:
javascript
const scores = [
{ score: 80 },
{ score: 90 },
{ score: 100 }
]
calc_avg('score', scores) // '90'
// 带格式化
calc_avg('score | =2', scores) // '90.00'
// 表达式计算后求平均
calc_avg('price * quantity', [
{ price: 10, quantity: 2 },
{ price: 20, quantity: 1 }
]) // '20' ((20 + 20) / 2)calc_max - 最大值
获取数组中表达式计算结果的最大值:
javascript
const products = [
{ price: 99 },
{ price: 199 },
{ price: 149 }
]
calc_max('price', products) // '199'
// 表达式计算后取最大
calc_max('price * discount', [
{ price: 100, discount: 0.8 },
{ price: 200, discount: 0.5 }
]) // '100' (max(80, 100))
// 负数场景
calc_max('value', [
{ value: -10 },
{ value: -5 },
{ value: -20 }
]) // '-5'calc_min - 最小值
获取数组中表达式计算结果的最小值:
javascript
const inventory = [
{ stock: 50 },
{ stock: 10 },
{ stock: 30 }
]
calc_min('stock', inventory) // '10'
// 带格式化
calc_min('stock | =0', inventory) // '10'
// 负数场景
calc_min('value', [
{ value: -10 },
{ value: -5 },
{ value: -20 }
]) // '-20'calc_count - 计数
统计数组中表达式结果为真值(非零)的数量:
javascript
const users = [
{ active: 1 },
{ active: 0 },
{ active: 1 }
]
calc_count('active', users) // '2'
// 结合条件表达式
calc_count('stock > 0 ? 1 : 0', [
{ stock: 10 },
{ stock: 0 },
{ stock: 5 }
]) // '2'
// 统计非零值
calc_count('value', [
{ value: 0 },
{ value: 1 },
{ value: -1 },
{ value: 0.5 }
]) // '3'实际应用场景
场景一:电商订单计算
javascript
import { calc_sum, calc_avg, calc_max, calc_min } from 'a-calc'
// 购物车商品
const cartItems = [
{ name: 'iPhone 15', price: 6999, quantity: 1, discount: 1 },
{ name: 'AirPods Pro', price: 1899, quantity: 2, discount: 0.9 },
{ name: '手机壳', price: 99, quantity: 3, discount: 0.8 }
]
// 计算订单总金额
const total = calc_sum('price * quantity * discount | =2', cartItems)
// 计算平均单价
const avgPrice = calc_avg('price | =2', cartItems)
// 找出最贵的商品价格
const maxPrice = calc_max('price', cartItems) // '6999'
// 找出最便宜的商品价格
const minPrice = calc_min('price', cartItems) // '99'场景二:工资薪酬汇总
javascript
import { calc_sum, calc_avg, calc_max, calc_min } from 'a-calc'
// 员工薪资数据
const salaries = [
{ name: '张三', base: 15000, bonus: 3000, tax: 1200 },
{ name: '李四', base: 12000, bonus: 2000, tax: 900 },
{ name: '王五', base: 18000, bonus: 5000, tax: 2100 },
{ name: '赵六', base: 10000, bonus: 1500, tax: 600 }
]
// 计算工资总支出
const totalCost = calc_sum('base + bonus | =2,', salaries)
// 计算平均工资
const avgSalary = calc_avg('base + bonus | =2', salaries)
// 最高工资
const maxSalary = calc_max('base + bonus', salaries)
// 最低工资
const minSalary = calc_min('base + bonus', salaries)场景三:考试成绩统计
javascript
import { calc_sum, calc_avg, calc_max, calc_min, calc_count } from 'a-calc'
// 学生成绩
const scores = [
{ name: '小明', score: 85 },
{ name: '小红', score: 92 },
{ name: '小刚', score: 78 },
{ name: '小丽', score: 95 },
{ name: '小王', score: 60 }
]
// 总分
calc_sum('score', scores) // '410'
// 平均分
calc_avg('score | =1', scores) // '82.0'
// 最高分
calc_max('score', scores) // '95'
// 最低分
calc_min('score', scores) // '60'
// 及格人数(>=60分)
calc_count('score >= 60 ? 1 : 0', scores) // '5'
// 优秀人数(>=90分)
calc_count('score >= 90 ? 1 : 0', scores) // '2'场景四:库存盘点
javascript
import { calc_sum, calc_avg, calc_min, calc_count } from 'a-calc'
// 库存商品
const inventory = [
{ sku: 'A001', name: '商品A', stock: 150, cost: 25.5 },
{ sku: 'A002', name: '商品B', stock: 0, cost: 45.8 },
{ sku: 'A003', name: '商品C', stock: 200, cost: 12.3 },
{ sku: 'A004', name: '商品D', stock: 50, cost: 99.9 }
]
// 库存总价值
calc_sum('stock * cost | =2,', inventory)
// 平均库存量
calc_avg('stock | =0', inventory)
// 最低库存(预警)
calc_min('stock', inventory) // '0'
// 有库存的商品数量
calc_count('stock', inventory) // '3'边界情况处理
javascript
// 空数组返回 '0'
calc_sum('value', []) // '0'
calc_avg('value', []) // '0'
// 空数组带格式化
calc_sum('value | =2', []) // '0.00'
// 某项计算失败会返回错误值
calc_sum('a / b', [
{ a: 10, b: 2 },
{ a: 5, b: 0 } // 除以零
]) // '-'(默认错误值)注意事项
- 格式化位置:格式化指令应放在表达式末尾,应用于最终结果
- 数据一致性:数组中每个对象应包含表达式所需的所有字段
- 空数组处理:空数组返回
'0'或格式化后的零值 - 错误传播:任意一项计算失败会导致整体返回错误值