如何基于两个数组生成键为单词、值为匹配次数的统计对象
基于两个数组生成统计对象的实现方案
需求说明
- 入参1:元素全部唯一的数组,作为最终生成对象的所有键
- 入参2:无元素限制的数组,用来统计匹配出现的次数
- 输出:键为入参1的元素,值为对应元素在入参2中出现次数的对象
示例参考
输入示例:
let uniqueArray = ['green', 'blue', 'red']; let anyArray = ['red', 'green', 'red', 'blue', 'yellow', 'green', 'pink', 'red'];
期望输出:
{ green: 2, blue: 1, red: 3 }
实现代码
方案1:Array.reduce 简洁实现
该方案写法精简,性能最优,仅需要遍历两个数组各一次:
function getCountObject(uniqueArray, anyArray) { // 先统计第二个数组所有元素的出现次数 const countMap = anyArray.reduce((map, item) => { map[item] = (map[item] || 0) + 1; return map; }, {}); // 基于第一个数组生成目标结构,未匹配到的元素默认值为0 return uniqueArray.reduce((result, key) => { result[key] = countMap[key] || 0; return result; }, {}); } // 调用测试 console.log(getCountObject(uniqueArray, anyArray))
方案2:普通循环实现
该方案逻辑直观,可读性更高:
function getCountObject(uniqueArray, anyArray) { const result = {}; // 初始化所有键的默认次数为0 for (let i = 0; i < uniqueArray.length; i++) { const key = uniqueArray[i]; result[key] = 0; } // 遍历第二个数组统计匹配次数 for (let j = 0; j < anyArray.length; j++) { const currentItem = anyArray[j]; if (result.hasOwnProperty(currentItem)) { result[currentItem]++; } } return result; }
性能说明
两种方案的时间复杂度均为O(m + n),其中m为第一个数组的长度,n为第二个数组的长度,无需嵌套循环,性能最优。
内容的提问来源于stack exchange,提问作者Baibulat Khamatullin
相关产品推荐
相关产品推荐

