Skip to content

数组聚合计算

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 }  // 除以零
])  // '-'(默认错误值)

注意事项

  1. 格式化位置:格式化指令应放在表达式末尾,应用于最终结果
  2. 数据一致性:数组中每个对象应包含表达式所需的所有字段
  3. 空数组处理:空数组返回 '0' 或格式化后的零值
  4. 错误传播:任意一项计算失败会导致整体返回错误值

基于 MIT 许可发布