You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于值合并对象数组(使用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 };

步骤拆解:

  1. _.groupBy(jsonEntries, 'FieldName')会把原始数组按FieldName分组,得到一个键为FieldName、值为对应对象数组的集合;
  2. 遍历分组后的每个键,提取对应所有对象的FieldValue组成数组;
  3. 根据数组长度决定返回数组还是单个字符串,完美匹配你的需求。

方案二:原生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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:47:16