Vue组件中JSON嵌套对象扁平化函数的优化:兼容name子属性与特定嵌套结构处理
搞定Vue中批量数据的混合扁平化需求
嘿,我来帮你解决这个数据处理的问题!你需要的是一个能同时处理两种场景的函数:既把带name属性的嵌套对象直接替换成name值,又能把shellfish这种特定嵌套结构里的species提取到顶层,同时移除原来的嵌套层级。下面是经过优化的getBatches方法,还附带了可扩展的方案:
基础解决方案(适配你的当前需求)
async getBatches() { try { const response = await fetch('/api/batches'); const rawData = await response.json(); return rawData.map(batch => { // 先把shellfish从原对象中解构出来,剩下的属性存在rest里 const { shellfish, ...rest } = batch; // 初始化扁平化对象,先加入提取的species(兼容shellfish不存在的情况) const flattened = { ...(shellfish?.species && { species: shellfish.species }), }; // 处理其他属性:扁平化带name的嵌套对象 for (const [key, value] of Object.entries(rest)) { // 确保值是有效对象且包含name属性时,才替换为name值 if (typeof value === 'object' && value !== null && 'name' in value) { flattened[key] = value.name; } else { flattened[key] = value; } } return flattened; }); } catch (error) { console.error('获取批次数据失败:', error); throw error; } }
代码说明:
- 解构分离shellfish:用ES6解构把
shellfish单独拎出来,避免和其他属性的扁平化逻辑冲突 - 安全提取species:用可选链操作符
?.判断shellfish是否存在,防止出现Cannot read property 'species' of null这类报错 - 保留原有扁平化逻辑:遍历剩余属性,遇到带
name的嵌套对象时自动替换为name值,其他属性原样保留
处理后你的数据会变成这样(以第一个批次为例):
{ "name":"Batch1", "description":"seed", "age":2, "quantity":1000, "source":"Hatchery", "hatchery":"robs hatchery", "location":"dingle", "species":"pacific gigas", "stock_type":"seeds" }
可扩展方案(适合未来新增类似需求)
如果以后你还有其他需要提取的特定嵌套结构(比如owner里的username),可以用规则配置的方式来扩展,不用反复修改核心逻辑:
async getBatches() { try { const response = await fetch('/api/batches'); const rawData = await response.json(); // 配置提取规则:key是嵌套属性名,value是要提取到顶层的字段名 const extractionRules = [ { nestedKey: 'shellfish', targetField: 'species' }, // 以后新增规则直接加在这里就行,比如: // { nestedKey: 'owner', targetField: 'username' } ]; return rawData.map(batch => { let processedBatch = { ...batch }; // 批量处理所有提取规则 extractionRules.forEach(rule => { const { nestedKey, targetField } = rule; if (processedBatch[nestedKey]?.[targetField]) { processedBatch[targetField] = processedBatch[nestedKey][targetField]; delete processedBatch[nestedKey]; } }); // 处理带name的嵌套对象扁平化 const flattened = {}; for (const [key, value] of Object.entries(processedBatch)) { if (typeof value === 'object' && value !== null && 'name' in value) { flattened[key] = value.name; } else { flattened[key] = value; } } return flattened; }); } catch (error) { console.error('获取批次数据失败:', error); throw error; } }
这样以后有新的嵌套结构需要处理时,只需要在extractionRules数组里加一条规则即可,代码的可维护性会高很多。
内容的提问来源于stack exchange,提问作者Michal Kubiak
相关产品推荐
相关产品推荐

