如何用ES5/ES6计算客户带折扣商品的总消费金额?
简洁实现:ES6 + ES5 版本计算带折扣商品总消费
当然可以!用ES6的数组高阶函数能把这段逻辑写得既简洁又易读,咱们直接上代码和解释:
ES6 实现代码
// 补全你的客户数据示例(可替换成真实数据) const clients = [ { id: 0, name: "Alice", items: [{ price: 100, disc: 20 }, { price: 50, disc: 0 }] }, { id: 1, name: "Bob", items: [{ price: 80, disc: 15 }, { price: 30, disc: 5 }] } ]; // 核心计算逻辑:仅统计带折扣的商品,累加 (price - disc) const totalDiscountedSpending = clients .flatMap(client => client.items) // 把所有客户的商品合并成一个一维数组 .filter(item => item.disc > 0) // 筛选出真正有折扣的商品(这里假设disc>0才算带折扣,可根据业务调整) .reduce((total, item) => total + (item.price - item.disc), 0); // 从0开始累加符合条件的商品消费 console.log(totalDiscountedSpending); // 输出:(100-20)+(80-15)+(30-5) = 170
代码拆解
flatMap:直接替代map+flat的组合,一步把每个客户的items数组展开,避免嵌套遍历的麻烦。filter:精准筛选需要统计的商品——如果你的业务里“带折扣”是指disc属性存在即可,把条件改成item.disc !== undefined就行。reduce:从初始值0开始,逐个累加符合条件商品的实际消费金额,最终得到总消费。
ES5 兼容版代码
如果需要适配不支持ES6的旧环境,用ES5的数组方法也能实现,只是写法稍显繁琐:
var clients = [ { id: 0, name: "Alice", items: [{ price: 100, disc: 20 }, { price: 50, disc: 0 }] }, { id: 1, name: "Bob", items: [{ price: 80, disc: 15 }, { price: 30, disc: 5 }] } ]; var totalDiscountedSpending = clients .map(function(client) { return client.items; }) // 先取出所有客户的商品数组 .concat.apply([], clients.map(function(c) { return c.items; })) // 合并成一维数组(替代ES6的flatMap) .filter(function(item) { return item.disc > 0; }) // 筛选带折扣的商品 .reduce(function(total, item) { return total + (item.price - item.disc); }, 0); // 累加计算 console.log(totalDiscountedSpending); // 同样输出170
ES5 逻辑说明
- 用
map+concat.apply的组合实现数组扁平化,替代ES6的flatMap。 filter和reduce的核心逻辑和ES6完全一致,只是用了传统函数表达式而非箭头函数。
如果需要更严谨的判断(比如避免折扣超过商品价格导致负数),只需要修改filter的条件,比如改成item.disc > 0 && item.disc < item.price即可。
内容的提问来源于stack exchange,提问作者H. Rib
相关产品推荐
相关产品推荐

