基于值合并对象数组(使用jQuery或Underscore)
合并重复FieldName对应的FieldValue为数组(单个值保留字符串)
看起来你想要把相同FieldName的多个FieldValue合并成数组,而单个值的保持原字符串类型对吧?咱们先聊聊你之前代码的问题,再给你靠谱的解决方案:
你的代码问题分析
- 用
_.filter的时候,这个方法的作用是筛选出符合条件的整个对象,而不是提取FieldValue,所以你得到的是匹配的对象数组,不是值的集合; - 换成
_.map后,因为没有处理不匹配的情况,当item.FieldName !== strFName时,回调函数没有返回值,自然就会出现大量undefined。
方案一:用Underscore.js快速实现
Underscore的_.groupBy天生适合这种分组场景,搭配后续的转换就能完美实现需求:
// 假设你的原始条目数组是 jsonEntries const grouped = _.groupBy(jsonEntries, 'FieldName'); // 转换为目标格式 const transformedEntries = Object.keys(grouped).map(fieldName => { // 提取当前FieldName对应的所有FieldValue const valueList = grouped[fieldName].map(item => item.FieldValue); return { FieldName: fieldName, // 多值返回数组,单值返回字符串 FieldValue: valueList.length > 1 ? valueList : valueList[0] }; }); // 最终结果 const result = { Entries: transformedEntries };
步骤拆解:
_.groupBy(jsonEntries, 'FieldName')会把原始数组按FieldName分组,得到一个键为FieldName、值为对应对象数组的集合;- 遍历分组后的每个键,提取对应所有对象的
FieldValue组成数组; - 根据数组长度决定返回数组还是单个字符串,完美匹配你的需求。
方案二:原生JavaScript实现(无依赖)
如果不想依赖Underscore,用原生JS的Map也能轻松搞定:
const fieldMap = new Map(); // 第一步:收集每个FieldName对应的所有FieldValue jsonEntries.forEach(item => { if (!fieldMap.has(item.FieldName)) { fieldMap.set(item.FieldName, []); } fieldMap.get(item.FieldName).push(item.FieldValue); }); // 第二步:转换为目标格式 const transformedEntries = Array.from(fieldMap).map(([fieldName, values]) => ({ FieldName: fieldName, FieldValue: values.length > 1 ? values : values[0] })); // 最终结果 const result = { Entries: transformedEntries };
这个方案的逻辑和Underscore版本一致,只是用原生API实现,兼容性更好。
你可以试试上面的代码,应该能完美解决你的问题~
内容的提问来源于stack exchange,提问作者Paprika
相关产品推荐
相关产品推荐

