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

JavaScript统计对象数组中元素出现次数的实现方案

统计对象数组中日期与国家组合的出现次数

需求说明

我有一个对象数组,需要生成包含新增Occurrences字段的新对象数组,该字段用于统计相同Date_Available与Country组合的出现次数。之前编写的代码在处理同日期不同国家的情况时统计错误,需要修正。

输入数组

const fakeJson = [
  {
    "Id": 1,
    "Name": "John",
    "Age": 32,
    "Date_Available": "2022-04-10",
    "Popularity": 99,
    "Country": "Canada"
  },
  {
    "Id": 1,
    "Name": "John",
    "Age": 32,
    "Date_Available": "2022-04-11",
    "Popularity": 99,
    "Country": "Canada"
  },
  {
    "Id": 1,
    "Name": "John",
    "Age": 32,
    "Date_Available": "2022-04-12",
    "Popularity": 99,
    "Country": "Canada"
  },
  {
    "Id": 1,
    "Name": "John",
    "Age": 32,
    "Date_Available": "2022-04-12",
    "Popularity": 99,
    "Country": "China"
  },
  {
    "Id": 1,
    "Name": "John",
    "Age": 32,
    "Date_Available": "2022-04-12",
    "Popularity": 99,
    "Country": "Canada"
  }
]

期望输出

const resultJSON = [
  {
    "Date_Available": "2022-04-10",
    "Popularity": 99,
    "Country": "Canada",
    "Occurrences" : 1
  },
  {
    "Date_Available": "2022-04-11",
    "Popularity": 99,
    "Country": "Canada",
    "Occurrences" : 1
  },
  {
    "Date_Available": "2022-04-12",
    "Popularity": 99,
    "Country": "Canada",
    "Occurrences" : 2
  },
  {
    "Date_Available": "2022-04-12",
    "Popularity": 99,
    "Country": "China",
    "Occurrences" : 1
  }
]

错误代码分析

你之前的代码核心问题是:没有用Date_Available和Country的组合作为唯一标识,而是单独用日期或国家作为映射键,导致同日期不同国家的组合被错误合并,统计逻辑混乱。

let countNameMapping = {};
let finalArr = [];

for(let i = 0; i < fakeJson.length; i++){
  let tempObj = {Country:fakeJson[i].Country, Date_Available: fakeJson[i].Date_Available, occurence: 1};
  let countryName = fakeJson[i].Country;
  let date = fakeJson[i].Date_Available;
  if(countNameMapping[date] === undefined){
    countNameMapping[countryName] = tempObj;
  } else {
    countNameMapping[date].occurence += 1;
  }
}

for(let k in countNameMapping){
  finalArr.push(countNameMapping[k])
}

console.log(finalArr)

正确解决方案

我们可以将Date_Available和Country拼接成唯一键(用|分隔避免冲突),以此作为映射对象的键来统计次数,最后将映射值转为数组即可:

const countMapping = {};

// 统计每个日期+国家组合的出现次数
fakeJson.forEach(item => {
  const key = `${item.Date_Available}|${item.Country}`;
  if (countMapping[key]) {
    countMapping[key].Occurrences += 1;
  } else {
    countMapping[key] = {
      Date_Available: item.Date_Available,
      Popularity: item.Popularity,
      Country: item.Country,
      Occurrences: 1
    };
  }
});

// 将映射对象转为目标数组
const resultJSON = Object.values(countMapping);

console.log(resultJSON);

这段代码会正确统计每个Date_Available与Country组合的出现次数,生成符合预期的结果数组。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 12:03:30