You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何筛选对象值并合并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}]

逻辑说明

  1. 分组键生成:用title和artist拼接成唯一字符串,确保只有两者都匹配的条目才会被分到同一组,解决了原代码只看title的问题。
  2. 遍历处理:用reduce遍历数组,每次检查当前条目对应的分组是否已存在:
    • 存在就直接累加plays;
    • 不存在就把当前条目(用展开运算符...拷贝,避免引用问题)加入结果数组。
  3. 保留完整字段:修正了原代码丢失artist字段的问题,最终结果里每个条目都包含title、artist和累加后的plays。

内容的提问来源于stack exchange,提问作者Vitor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 00:37:08