如何用JavaScript转换含数组对象并筛选funcName含ABS的条目
如何过滤并转换包含数组的JavaScript对象?
嘿,我来帮你完善这个转换函数!你的思路是对的,但草稿里有一些语法错误和逻辑小问题,我们一步步来修正它。
需求回顾
我们需要将原始对象处理成指定格式:
- 仅保留
funcName中包含"ABS"的条目 - 把符合条件的条目转换为
{name: 英文主题, link: 函数名}的结构 - 最终将所有结果放入
worklinks数组中
修正后的完整函数
export const functTransform = (data) => { // 1. 提取原始对象中所有的锻炼数组,合并为一个一维数组 const allExercises = Object.values(data).flat(); // 2. 筛选出含"ABS"的条目,并转换为目标格式 const worklinks = allExercises .filter(item => item.funcName.includes("ABS")) .map(({ funcName, subject }) => ({ name: subject.en, link: funcName })); // 3. 返回最终的结构 return { worklinks }; };
步骤详解
合并数组:
Object.values(data)会获取原始对象的所有值(也就是SUMMER和WINTER对应的两个数组),再用.flat()把它们合并成一个一维数组,方便后续统一处理。筛选+转换:
.filter(item => item.funcName.includes("ABS")):过滤出funcName包含"ABS"的条目,用includes比search更直观,效果完全一致。.map(...):通过解构赋值取出每个条目的funcName和subject,直接转换成我们需要的name和link结构。
返回结果:
把处理好的数组包装成{worklinks: ...}的对象返回,和你预期的AfterData结构完全匹配。
测试验证
把你的原始数据传入函数,就能得到预期结果:
let beforeData = { SUMMER: [ { funcName: '{{WORKING_ABS}}', subject: { en: "Exercice1"} }, { funcName: '{{PULLS_BODY}}', subject: { en: "Exercice2"} }, ], WINTER: [ { funcName: '{{FULL_BODY}}', subject: { en: "Exercice3"} }, { funcName: '{{REST_ABS}}', subject: { en: "Exercice4"} }, ] }; console.log(functTransform(beforeData)); // 输出: // { // worklinks: [ // { name: 'Exercice1', link: '{{WORKING_ABS}}' }, // { name: 'Exercice4', link: '{{REST_ABS}}' } // ] // }
小补充
如果需要兼容非常老旧的浏览器,可以把includes换成indexOf("ABS") !== -1,功能是一样的。
内容的提问来源于stack exchange,提问作者James Bertaha
相关产品推荐
相关产品推荐

