JavaScript实现统计数组中指定值的对象数量
统计数组中指定日期的预订次数
嘿,我懂你不想用复杂的循环嵌套来统计预订次数的心情,其实用JavaScript的reduce方法就能轻松搞定这个需求,代码简洁还易维护!
思路拆解
我们可以分两步实现:
- 先用
reduce遍历数组,把相同日期的预订次数统计成一个键值对对象(键是你想要的日期标识,值是对应次数) - 再把这个统计对象转换成你需要的数组格式(每个元素是单个键值对对象)
完整代码实现
首先定义你的原始预订数组:
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 } ]
灵活调整
如果你觉得转英文标识太麻烦,只想用day1、day2这种简单格式,直接把辅助函数改成这样就行:
function getDayLabel(dayNumber) { return `day${dayNumber}`; }
这样输出就会变成[ { day1: 2 }, { day17: 1 } ],完全看你的需求调整~
内容的提问来源于stack exchange,提问作者Murakami




