分类数据过滤与嵌套options数组构建技术问题求助
解决分类数据结构化问题:从API响应生成带子分类的父分类数组
我看了你的代码和数据,发现几个小问题导致你没得到期望的结果,咱们一步步来修正:
原代码的问题点
- 存在一行完全无用的代码:
person => { if (person.age > 18) return person; };,这行和分类处理毫无关系,直接删掉就好 - 使用
parentCategories.map(...)但没利用map的返回值,反而尝试用未定义的变量i给categorys[i]赋值,这会直接触发运行错误 - 过滤子分类后,没有将子分类转换为仅包含
name和id的对象,保留了原对象的多余字段 - 最终返回的是对象
categorys,但你期望的是数组格式
修正后的代码
export function getCategories(state = [], action) { switch (action.type) { case "FETCH_DATA_SUCCESS": // 分离父分类与子分类 const subCategories = action.data.categories.filter( category => category.parent > 0 ); const parentCategories = action.data.categories.filter( category => category.parent === 0 ); // 遍历父分类,生成目标格式数组 const formattedCategories = parentCategories.map(parentCategory => { // 过滤当前父分类对应的子分类,并转换为仅含name和id的结构 const options = subCategories .filter(sub => sub.parent === parentCategory.id) .map(sub => ({ name: sub.name, id: sub.id })); // 构造符合期望的父分类对象,value字段这里用原父分类id,可按需调整 return { id: parentCategory.id, label: parentCategory.name.replace(/^year(\d)/, (_, num) => `Year ${num}`), // 把year1转为Year 1 value: parentCategory.id, options: options }; }); return formattedCategories; default: return state; } }
代码关键说明
- 分类分离:还是用
filter把父分类(parent=0)和子分类(parent>0)拆分出来 - 子分类格式化:对每个父分类,先过滤出属于它的子分类,再用
map把每个子分类转成仅包含name和id的对象,匹配你要的options结构 - 父分类格式化:把原父分类的
name转成首字母大写加空格的格式(比如year1→Year 1),补充value字段(这里复用了父分类的id,如果你需要自增数字,可以用map的第二个参数index) - 返回数组:
map的结果就是我们需要的数组,直接返回即可
基于你的原始数据的输出结果
运行修正后的代码,会得到和你期望结构一致的数组:
[ { id: 60, label: "Year 1", value: 60, options: [ { name: "firm1", id: 59 } ] }, { id: 63, label: "Year 2", value: 63, options: [ { name: "firm1", id: 65 } ] }, { id: 64, label: "Year 3", value: 64, options: [ { name: "firm3", id: 68 } ] } ]
内容的提问来源于stack exchange,提问作者Bomber
相关产品推荐
相关产品推荐

