Rails:特定键值相同时如何合并数组中的哈希?
合并数组中相同ID的对象,拼接指定字段
这问题我之前也碰到过,用JavaScript的reduce方法就能轻松实现需求,直接上代码和详细解释:
代码实现
const originalArray = [ { id: 77, member_phone: "9876543210", created_at: "2017-05-03T11:06:03.000Z", name: "Sure" }, { id: 77, member_phone: "123456789", created_at: "2017-05-03T11:06:03.000Z", name: "Sure" }, { id: 78, member_phone: "12345", created_at: "2017-05-03T11:06:03.000Z", name: "XYZ" } ]; // 核心逻辑:用reduce分组,再合并指定字段 const mergedArray = Object.values( originalArray.reduce((groupedObj, currentItem) => { // 以id作为分组的唯一标识 const groupKey = currentItem.id; if (!groupedObj[groupKey]) { // 如果该id还没分组,直接复制当前对象到分组中 groupedObj[groupKey] = { ...currentItem }; } else { // 已有分组,把member_phone用逗号拼接 groupedObj[groupKey].member_phone += `,${currentItem.member_phone}`; } return groupedObj; }, {}) // 初始值是一个空对象,用来存储分组结果 ); console.log(mergedArray);
代码解释
- 分组逻辑:通过
reduce遍历原数组,把相同id的对象归到同一个分组里,分组的键就是id值。 - 字段合并:第一次遇到某个
id时,直接把对象拷贝到分组中;后续再遇到相同id的对象,就把它的member_phone追加到已有对象的member_phone后面,用逗号分隔。 - 转换为数组:最后用
Object.values()把分组对象里的所有值提取出来,就是我们需要的合并后数组。
注意:如果相同id的对象中,created_at、name这类字段可能存在不一致的情况,你可以根据需求调整逻辑,比如保留第一个对象的字段值,或者做其他处理——不过根据你的示例,这些字段都是相同的,所以上面的代码完全适用。
内容的提问来源于stack exchange,提问作者Jasjeet Singh
相关产品推荐
相关产品推荐

