统计问题结果出现次数并生成目标对象数组
解决JavaScript数组的问题结果统计需求
你的现有代码已经迈出了第一步——把每个对象拆分成了对应单个问题的条目,但还缺少统计次数的核心逻辑。我来帮你完善这个功能,直接得到你想要的newArray结构:
实现思路
- 用
reduce遍历原数组,同时维护一个分组映射表,用对象存储即可,键是category+question的组合(比如cat1_question1),确保每个分类下的每个问题唯一对应一条统计数据; - 对每个元素的
question1和question2分别处理:- 如果映射表里还没有当前分类+问题的条目,就初始化一个包含
category、question、blue:0、red:0的对象; - 根据当前问题的答案(blue/red),对应字段的计数加1;
- 如果映射表里还没有当前分类+问题的条目,就初始化一个包含
- 最后把映射表的值转换成数组,就是你要的结果。
完整代码实现
var myArray = [ {id: "1" , category: "cat1", "question1": "blue", "question2":"blue"}, {id: "1" , category: "cat1", "question1": "blue", "question2":"red"}, {id: "2" , category: "cat2", "question1": "blue", "question2":"blue"}, {id: "2" , category: "cat2", "question1": "red", "question2":"blue"} ]; var newArray = Object.values(myArray.reduce((map, item) => { // 处理question1 const key1 = `${item.category}_question1`; if (!map[key1]) { map[key1] = { category: item.category, question: "question1", blue: 0, red: 0 }; } map[key1][item.question1]++; // 处理question2 const key2 = `${item.category}_question2`; if (!map[key2]) { map[key2] = { category: item.category, question: "question2", blue: 0, red: 0 }; } map[key2][item.question2]++; return map; }, {})); console.log(newArray);
代码运行结果
输出的newArray完全符合你的需求:
[ { category: 'cat1', question: 'question1', blue: 2, red: 0 }, { category: 'cat1', question: 'question2', blue: 1, red: 1 }, { category: 'cat2', question: 'question1', blue: 1, red: 1 }, { category: 'cat2', question: 'question2', blue: 2, red: 0 } ]
这种方法只需要遍历一次原数组,效率很高,而且逻辑清晰,后续如果新增question3这类字段,也能快速适配扩展。
内容的提问来源于stack exchange,提问作者observatoire
相关产品推荐
相关产品推荐

