如何筛选对象值并合并artist与title相同的条目
按歌手与歌曲名合并播放量的JS实现
需求很明确:从对象数组里筛选条目,只有当"artist"和"title"同时完全匹配时,才合并这些条目,并把它们的"plays"数值累加。
你现有的代码只考虑了歌曲名(title)作为分组依据,还漏了歌手(artist)字段的处理,逻辑上存在问题,下面是修正后的完整代码:
var data = '[{"title":"Better","artist":"Ben Platt","plays":"5"},{"title":"Better","artist":"OneRepublic","plays":"12"},{"title":"Honest Man","artist":"Ben Platt","plays":"23"},{"title":"Better","artist":"Ben Platt","plays":"9"}]'; // 解析JSON为对象数组 const obj = JSON.parse(data); // 将plays转换为整数 obj.forEach(item => { item.plays = parseInt(item.plays, 10); }); // 按title+artist组合分组,累加plays const grouped = obj.reduce((result, currentItem) => { // 生成唯一分组键:用title和artist拼接,确保两者都相同才会归为一组 const groupKey = `${currentItem.title}-${currentItem.artist}`; // 查找当前分组是否已存在 const existingItem = result.find(item => `${item.title}-${item.artist}` === groupKey); if (existingItem) { // 已存在则累加播放量 existingItem.plays += currentItem.plays; } else { // 不存在则新增条目到结果数组 result.push({...currentItem}); } return result; }, []); // 转换回JSON格式(如果需要字符串输出) const output = JSON.stringify(grouped); console.log(output);
执行后会得到你期望的结果:
[{"title":"Better","artist":"Ben Platt","plays":14},{"title":"Better","artist":"OneRepublic","plays":12},{"title":"Honest Man","artist":"Ben Platt","plays":23}]
逻辑说明
- 分组键生成:用
title和artist拼接成唯一字符串,确保只有两者都匹配的条目才会被分到同一组,解决了原代码只看title的问题。 - 遍历处理:用
reduce遍历数组,每次检查当前条目对应的分组是否已存在:- 存在就直接累加
plays; - 不存在就把当前条目(用展开运算符
...拷贝,避免引用问题)加入结果数组。
- 存在就直接累加
- 保留完整字段:修正了原代码丢失
artist字段的问题,最终结果里每个条目都包含title、artist和累加后的plays。
内容的提问来源于stack exchange,提问作者Vitor
相关产品推荐
相关产品推荐

