JS合并数组对象:按语言合并并重构属性结构
按语言合并对象的实现方案
针对你需要将数组中对象按lang分组,并把field转为属性名、text转为对应值的需求,这里提供两种实用实现方式:
方式一:使用reduce(推荐)
reduce天生适配这类分组合并场景,代码简洁紧凑:
const originalArray = [ {"field": "name","lang": "it","text": "RegoleAziendali"}, {"field": "pdf_url","lang": "it", "text": "docs/it/file.pdf"}, {"field": "name","lang": "en","text": "CompanyRules"}, {"field": "pdf_url","lang": "en", "text": "docs/en/file.pdf"} ]; const mergedArray = Object.values(originalArray.reduce((acc, current) => { const langKey = current.lang; // 首次遇到该语言时,初始化对应对象 if (!acc[langKey]) { acc[langKey] = { lang: langKey }; } // 将field作为属性名、text作为属性值存入对应语言对象 acc[langKey][current.field] = current.text; return acc; }, {})); console.log(mergedArray);
方式二:使用forEach
如果更习惯forEach的写法,只需维护一个临时语言映射对象即可:
const originalArray = [/* 原数组内容 */]; const langMap = {}; originalArray.forEach(item => { const { lang, field, text } = item; // 初始化当前语言的对象 if (!langMap[lang]) { langMap[lang] = { lang }; } // 赋值对应的属性键值对 langMap[lang][field] = text; }); // 将映射对象转换为目标数组 const mergedArray = Object.values(langMap);
两种方式最终都会输出你预期的结果:
[ {"lang": "it","name": "RegoleAziendali","pdf_url":"docs/it/file.pdf"}, {"lang": "en","name": "CompanyRules","pdf_url":"docs/en/file.pdf"} ]
核心逻辑一致:
- 以
lang作为分组标识,聚合同语言的对象 - 将每个元素的
field转为新对象的属性名,text转为对应属性值 - 最后将聚合后的映射结构转为数组格式
内容的提问来源于stack exchange,提问作者beginnerspirit
相关产品推荐
相关产品推荐

