You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

JavaScript实现统计数组中指定值的对象数量

统计数组中指定日期的预订次数

嘿,我懂你不想用复杂的循环嵌套来统计预订次数的心情,其实用JavaScript的reduce方法就能轻松搞定这个需求,代码简洁还易维护!

思路拆解

我们可以分两步实现:

  1. 先用reduce遍历数组,把相同日期的预订次数统计成一个键值对对象(键是你想要的日期标识,值是对应次数)
  2. 再把这个统计对象转换成你需要的数组格式(每个元素是单个键值对对象)

完整代码实现

首先定义你的原始预订数组:

const bookings = [
  { "_id": "5b09cc3495cb6c0487f1166b", "name": "ccc", "email": "ccc@gmail.com", "phone": "790467522", "kidsNo": "1", "adultsNo": "1", "fullDate": "2018/5/1", "year": "2018", "month": "5", "day": "1", "chosenHour": "11:00", "chosenRoom": "x", "__v": 0 },
  { "_id": "5b09cc6095cb6c0487f1166c", "name": "asd", "email": "asd@asd.pl", "phone": "790467522", "kidsNo": "2", "adultsNo": "3", "fullDate": "2018/5/1", "year": "2018", "month": "5", "day": "1", "chosenHour": "12:00", "chosenRoom": "x", "__v": 0 },
  { "_id": "5b0b1560c7b4fd0c33b2d52e", "name": "dddd", "email": "dddd@ddd.pl", "phone": "123123112", "kidsNo": "2", "adultsNo": "1", "fullDate": "2018/5/17", "year": "2018", "month": "5", "day": "17", "chosenHour": "11:00", "chosenRoom": "x", "__v": 0 }
];

然后添加辅助函数(用于把数字日期转成你要的英文标识,比如1转成dayOne):

// 数字转英文日期标识的辅助函数
function getDayLabel(dayNumber) {
  const ordinals = {
    1: 'One', 2: 'Two', 3: 'Three', 4: 'Four', 5: 'Five',
    6: 'Six', 7: 'Seven', 8: 'Eight', 9: 'Nine', 10: 'Ten',
    11: 'Eleven', 12: 'Twelve', 13: 'Thirteen', 14: 'Fourteen',
    15: 'Fifteen', 16: 'Sixteen', 17: 'Seventeen', 18: 'Eighteen',
    19: 'Nineteen', 20: 'Twenty', 21: 'TwentyOne', 22: 'TwentyTwo',
    23: 'TwentyThree', 24: 'TwentyFour', 25: 'TwentyFive', 26: 'TwentySix',
    27: 'TwentySeven', 28: 'TwentyEight', 29: 'TwentyNine', 30: 'Thirty',
    31: 'ThirtyOne'
  };
  return `day${ordinals[dayNumber]}`;
}

最后执行统计和格式转换:

// 第一步:统计每个日期的预订次数
const countByDay = bookings.reduce((acc, booking) => {
  const dayNum = parseInt(booking.day); // 把字符串类型的day转成数字
  const dayLabel = getDayLabel(dayNum);
  // 累加计数:如果该日期还没统计过,初始化为0再加1,否则直接加1
  acc[dayLabel] = (acc[dayLabel] || 0) + 1;
  return acc;
}, {});

// 第二步:转换成目标数组格式
const result = Object.entries(countByDay).map(([key, value]) => ({ [key]: value }));

console.log(result);

输出结果

运行上面的代码,你会得到:

[ { dayOne: 2 }, { daySeventeen: 1 } ]

灵活调整

如果你觉得转英文标识太麻烦,只想用day1day2这种简单格式,直接把辅助函数改成这样就行:

function getDayLabel(dayNumber) {
  return `day${dayNumber}`;
}

这样输出就会变成[ { day1: 2 }, { day17: 1 } ],完全看你的需求调整~

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

火山引擎 最新活动