遍历Question数组提取唯一Categories至新数组的方案咨询
解决方案:收集并去重分类数组
嘿,这个需求很常见,我给你几个实用的JavaScript实现方案,都能快速得到你想要的结果:
方法1:用flatMap + Set(最简洁)
这是现代JS里最推荐的写法,一行核心代码就能搞定:
// 你的原始数据(修正了对象键的引号,符合JS语法规范) const data = { questions: [ { question: 'lala', answer: 'papa', categories: ['Handla'] }, { question: 'xxxx', answer: 'yyyy', categories: ['Reklamation'] }, { question: 'abcefg', answer: 'gooooogle', categories: ['Reklamation'] } ] }; // 核心处理代码 const uniqueCategories = [...new Set(data.questions.flatMap(item => item.categories))]; console.log(uniqueCategories); // 输出: ["Handla", "Reklamation"]
逻辑拆解:
flatMap(item => item.categories):遍历所有question对象,把每个对象的categories数组展开成一维数组,得到['Handla', 'Reklamation', 'Reklamation']new Set(...):利用Set自动去重的特性,把重复的Reklamation过滤掉[...]:把Set对象转回普通数组,就是最终的去重结果
方法2:兼容旧环境的写法(map + concat + Set)
如果你的运行环境不支持flatMap(比如一些旧版浏览器),可以用这个替代方案:
const data = { /* 同上的原始数据 */ }; // 先把所有分类合并成一维数组 const allCategories = [].concat(...data.questions.map(item => item.categories)); // 再进行去重处理 const uniqueCategories = [...new Set(allCategories)]; console.log(uniqueCategories);
逻辑拆解:
map(item => item.categories):先得到一个二维数组[['Handla'], ['Reklamation'], ['Reklamation']][].concat(...arr):用扩展运算符把二维数组展开,合并成一维数组- 后续的Set去重和转数组步骤和方法1完全一致
方法3:手动循环实现(适合理解基础逻辑)
如果你想更清晰地控制每一步流程,可以用双层循环手动完成收集和去重:
const data = { /* 同上的原始数据 */ }; const uniqueCategories = []; // 遍历每个question对象 for (const question of data.questions) { // 遍历当前对象的所有分类 for (const category of question.categories) { // 如果分类还没在结果数组里,就添加进去 if (!uniqueCategories.includes(category)) { uniqueCategories.push(category); } } } console.log(uniqueCategories);
逻辑拆解:
- 外层循环逐个处理每个question对象,内层循环遍历该对象的所有分类
- 每次检查当前分类是否已经存在于结果数组中,只有不存在的时候才添加,自然实现去重效果
这三个方法都能满足你的需求,根据你的代码运行环境和个人习惯选择就行~
内容的提问来源于stack exchange,提问作者Joelgullander
相关产品推荐
相关产品推荐

