javascript - 仅对对象数组中的数值求和
问题描述
鉴于这种数组
const arr = [{
a: 12,
b: "A"
c: 17
},
{
a: 12,
b: "B"
c: 17
},
{
a: 12,
b: "C"
c: 17
}
];
对数组中的所有对象求和的最有效方法是什么?结果将是[29,29,29]
我试过arr.map(a => Object.values(a).reduce((p,c) => p+c))
了,但这会将非数字值附加到结果中。
解决方案
只需在减少之前根据类型过滤值
const arr = [{a: 12,b: "A",c: 17},{a: 12,b: "B",c: 17},{a: 12,b: "C",c: 17}];
let final = arr.map(a => Object.values(a).filter(v => typeof v === 'number').reduce((p, c) => p + c))
console.log(final)
或者您可以在 reduce 方法本身中执行此操作,根据其类型添加当前值,如果类型是数字,则添加它,否则添加 0
const arr = [{a: 12,b: "A",c: 17},{a: 12,b: "B",c: 17},{a: 12,b: "C",c: 17}];
let final = arr.map(a => Object.values(a).reduce((p, c) => p + (typeof c === 'number' ? c : 0)))
console.log(final)
推荐阅读
- redis - Redis自动递增id作为唯一键可以吗?
- reactjs - AXIOS 请求方法更改为 'OPTIONS' 而不是 'GET'
- python - 从 tkinter Text 小部件中作为文本存在的文件名(仅基名)获取文件详细信息(完整文件路径)
- android - 从另一个片段打开片段
- javascript - window.addEventListener('load',... 没有在 Safari 上触发?
- php - 您可以在两个表之间执行“INSERT SELECT WHERE”吗?
- c - 用 LD_PRELOAD 覆盖 getuid 不能直接工作,但在 gdb 中工作
- swift - 在无法访问以编程方式创建的 UILabel 时定义 #selector 方法
- scala - IntelliJ 不再为 Run 进行配置
- python - Gensim Word2vec 模型在增加训练期间不会更新前一个单词的嵌入权重