如何简洁实现JSON中metadata对象内所有整数属性求和?
简洁实现metadata属性值求和的方案
嘿,这问题挺典型的,不用逐个手动加属性值,我给你几个实用又简洁的方案:
方案1:Object.values() + Array.reduce()(最推荐)
这是现代JavaScript里最简洁高效的写法,两步搞定:
- 用
Object.values()把metadata的所有属性值提取成数组 - 用
reduce()方法对数组元素进行累加
代码示例:
const data = { metadata: { a: 0, b: 4, c: 1, d: 6 } }; const totalSum = Object.values(data.metadata).reduce((accumulator, currentValue) => accumulator + currentValue, 0); console.log(totalSum); // 输出:11
注意:这里reduce的第二个参数0是累加初始值,必须加上——如果metadata是空对象,没有初始值会返回undefined,加上后会正确返回0。
方案2:带类型校验的求和(兼容非数值属性)
如果metadata里可能混入非数值类型的属性,我们可以在累加时加个类型判断,避免计算出错:
const data = { metadata: { a: 0, b: 4, c: '1', d: 6 } }; // 这里c是字符串 const totalSum = Object.values(data.metadata).reduce((acc, curr) => { return typeof curr === 'number' ? acc + curr : acc; }, 0); console.log(totalSum); // 输出:10(忽略了字符串类型的c)
方案3:for...in循环(手动控制型)
如果你更习惯传统循环写法,或者需要对遍历过程做更多自定义操作,for...in也是个可行选择:
const data = { metadata: { a: 0, b: 4, c: 1, d: 6 } }; let totalSum = 0; for (const key in data.metadata) { // 用hasOwnProperty确保只遍历对象自身的属性(排除原型链上的属性) if (data.metadata.hasOwnProperty(key)) { totalSum += data.metadata[key]; } } console.log(totalSum); // 输出:11
总结一下,日常开发里最优先选方案1,简洁又符合现代JS的写法;如果有特殊类型兼容需求就用方案2;方案3适合需要更精细控制遍历逻辑的场景。
内容的提问来源于stack exchange,提问作者jaekie
相关产品推荐
相关产品推荐

