Lodash 数学方法怎么做数组统计和数值处理?
Lodash 的数学方法主要解决两类问题:数组统计和数值规整。数组统计包括 _.sum、_.mean、_.max、_.min,对象数组则用 _.sumBy、_.meanBy、_.maxBy、_.minBy。数值规整包括 _.clamp 限制范围、_.inRange 判断区间、_.random 生成随机数,以及 _.round、_.ceil、_.floor 做精度处理。它的价值不在于做复杂数学,而是减少项目里重复、零散、容易写错的小计算。要注意,Lodash 不会自动解决金融精度、安全随机数、业务合法性校验这些更深的问题。
常用数学方法怎么组合?
如果后台返回订单、评分、库存这类列表,先用 sumBy 或 meanBy 抽字段统计,再用 clamp 处理百分比边界,最后用 round 控制展示精度。这样代码比手写 reduce 更短,也更容易看出业务意图。
jsimport _ from 'lodash'; const orders = [ { price: 19.99, count: 2 }, { price: 8.5, count: 3 }, { price: 120, count: 1 } ]; const subtotal = _.sumBy(orders, item => item.price * item.count); const rate = _.clamp(_.toNumber('12.5'), 0, 100); const discount = _.round(subtotal * rate / 100, 2); const total = _.round(subtotal - discount, 2); console.log({ subtotal, rate, discount, total });
追问
_.sum 和 _.sumBy 应该怎么取舍?
数组本身是 [1, 2, 3] 这种纯数字时,用 _.sum 最清楚。只要数组元素变成对象,就应该换成 _.sumBy,否则还要先 map 一遍,代码会绕。踩坑点是字段不存在会带来 undefined,结果可能变成 NaN。更稳的写法是 item => _.toNumber(item.amount) || 0,让脏数据先落到可控默认值。
_.clamp 和 _.inRange 有什么区别?
_.clamp 会修正值,比如 150 被限制到 0-100 后返回 100。_.inRange 只判断真假,越界就返回 false。进度条、评分、百分比输入适合 clamp,权限、年龄、库存校验更适合 inRange。边界坑是 _.inRange(100, 0, 100) 为 false,因为它不包含右边界。
Lodash 的 _.round 能解决金额精度问题吗?
_.round(value, 2) 适合展示层保留两位小数,但它不是金融计算方案。JavaScript 浮点误差仍然存在,0.1 + 0.2 不会因为用了 Lodash 就彻底消失。普通报表和前端预估通常够用;支付、结算、发票应使用整数分或 decimal 类库。业务上还要提前定好向上、向下还是四舍五入,别把展示规则当结算规则。
_.random 可以生成验证码或 token 吗?
不建议。_.random 适合测试数据、随机颜色、抽样演示这类非安全场景。验证码、登录 token、抽奖签名应使用 Web Crypto 或 Node.js crypto。它也不支持种子,所以不适合需要可复现随机序列的测试。传入浮点范围时,通常还要配合 _.round 控制展示结果。
_.toNumber、_.toFinite、_.toInteger 怎么选?
_.toNumber 保留正常数字结果,'3.2' 会变成 3.2。_.toFinite 更像兜底,会把 NaN 转成 0,并把无穷大压到最大有限数。_.toInteger 会丢掉小数,适合页码、数量、循环次数。坑在于“能转换”不等于“业务有效”,比如 null 可能变成 0,但表单里空值往往应该提示补填。