如何无需判断属性存在,使用+=给对象可能不存在的属性累加值?
无需判断属性存在性的分组累加实现方案
有两种符合需求的实现方式:
- 方案1:使用Proxy代理对象实现默认值兜底,完全支持直接使用
+=运算
Proxy可以捕获对象的属性读取行为,当访问不存在的属性时默认返回0,从根源避免NaN问题,无需修改原有累加逻辑:
const myArray = [ {date: 'date1', amount: 1}, {date: 'date1', amount: 2}, {date: 'date2', amount: 3}, {date: 'date2', amount: 4}, ] // 代理对象,读取不存在的属性时默认返回0 const myObj = new Proxy({}, { get: (target, prop) => target[prop] ?? 0 }) myArray.forEach(arrayObj => { // 无需判断属性是否存在,直接+=即可 myObj[arrayObj.date] += arrayObj.amount }) console.log(myObj) // 输出 { date1: 3, date2: 7 }
- 方案2:空值合并运算符兜底默认值,轻量化无显式分支判断
如果不需要严格保留+=的写法,用??运算符对不存在的属性兜底默认值0即可,不会影响0、空字符串这类合法假值的运算,兼容性适配ES2020及以上环境:
const myObj = {} myArray.forEach(arrayObj => { myObj[arrayObj.date] = (myObj[arrayObj.date] ?? 0) + arrayObj.amount })
也可以和Array.reduce配合实现更简洁的聚合写法:
const myObj = myArray.reduce((acc, curr) => { acc[curr.date] = (acc[curr.date] ?? 0) + curr.amount return acc }, {})
内容的提问来源于stack exchange,提问作者user2876623
相关产品推荐
相关产品推荐

