Node.js读取XLSX列并统计数字出现次数的实现求助
Node.js 实现XLSX数据列的数字频次统计
前提假设
你已经通过xlsx库将Excel文件转为如下结构的JSON数组(示例):
const excelJsonData = [ { numbers: "1-3-5-7-9", lucky_numbers: "2" }, { numbers: "2-4-6-8-10", lucky_numbers: "5" }, { numbers: "1-2-3-4-5", lucky_numbers: "2" }, // ... 更多数据行 ];
步骤1:编写通用统计函数
先写一个复用的频次统计函数,接收数字数组,返回以数字为键、频次为值的对象:
function countNumberOccurrences(numArray) { return numArray.reduce((countMap, num) => { // 统一转成数字类型,避免字符串/数字类型不一致导致统计错误 const number = Number(num); countMap[number] = (countMap[number] || 0) + 1; return countMap; }, {}); }
步骤2:分别处理两列数据
处理numbers列(拆分"-"分隔的数字串)
遍历JSON数组,拆分每个numbers字段的字符串为单个数字,合并成一个大数组后统计:
// 提取并拆分所有numbers列的数字 const allNumbers = excelJsonData.flatMap(item => { return item.numbers.split("-"); }); // 统计频次 const numbersCount = countNumberOccurrences(allNumbers);
处理lucky_numbers列(单个数字)
直接提取所有lucky_numbers字段值,转成数组后统计:
// 提取所有lucky_numbers列的数字 const allLuckyNumbers = excelJsonData.map(item => { return item.lucky_numbers; }); // 统计频次 const luckyNumbersCount = countNumberOccurrences(allLuckyNumbers);
步骤3:对统计结果排序
根据需求选择排序方式:
按数字大小排序
将统计对象转为数组,按数字升序/降序排列:
// 按数字升序排序numbers列统计结果 const sortedNumbersByValue = Object.entries(numbersCount) .sort((a, b) => Number(a[0]) - Number(b[0])); // 按数字升序排序lucky_numbers列统计结果 const sortedLuckyByValue = Object.entries(luckyNumbersCount) .sort((a, b) => Number(a[0]) - Number(b[0]));
按频次高低排序
按频次从高到低(或低到高)排列:
// 按频次降序排序numbers列统计结果 const sortedNumbersByCount = Object.entries(numbersCount) .sort((a, b) => b[1] - a[1]); // 按频次降序排序lucky_numbers列统计结果 const sortedLuckyByCount = Object.entries(luckyNumbersCount) .sort((a, b) => b[1] - a[1]);
最终输出示例
比如sortedNumbersByValue会得到类似:
[ [ '1', 2 ], [ '2', 2 ], [ '3', 2 ], [ '4', 2 ], [ '5', 2 ], [ '7', 1 ], [ '8', 1 ], [ '9', 1 ], [ '10', 1 ] ]
你可以根据需要将排序后的数组转回对象,或者直接用于展示。
内容的提问来源于stack exchange,提问作者David Flenaugh
相关产品推荐
相关产品推荐

