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

合并对象数组并将同key对应value归集为数组的实现方法,可使用lodash

对象数组分类合并实现方案

需求说明

我们需要对嵌套结构的对象数组做合并,同一分类(如algo、base)下相同key对应的value会被收集为数组格式,支持数字、字符串等基础类型的value。

示例输入

const arr1 = [
  {
    algo: [
      { key: 'c', value: 1 },
      { key: 'java', value: 2 },
    ],
    base: [
      { key: 'js', value: 3 },
      { key: 'python', value: 4 },
    ],
  },
  {
    algo: [
      { key: 'c', value: 10 },
      { key: 'java', value: 20 },
    ],
    base: [
      { key: 'js', value: 30 },
      { key: 'python', value: 40 },
    ],
  },
]

预期输出

const results = [
  {
    algo: [
      { key: 'c', value: [1, 10] },
      { key: 'java', value: [2, 20] },
    ],
    base: [
      { key: 'js', value: [3, 30] },
      { key: 'python', value: [4, 40] },
    ],
  },
]

实现方案

方案1:基于lodash实现(代码最简洁)

直接利用lodash的聚合、遍历能力快速实现:

const _ = require('lodash');

function mergeCategoryArrays(arr) {
  // 第一步:聚合所有分类下的所有条目
  const allCategoryEntries = _.reduce(arr, (result, currentObj) => {
    _.forIn(currentObj, (entries, category) => {
      result[category] = result[category] ? result[category].concat(entries) : entries;
    })
    return result;
  }, {});

  // 第二步:每个分类下按key分组,合并value为数组
  const mergedObj = _.mapValues(allCategoryEntries, (categoryEntries) => {
    const keyGroup = _.groupBy(categoryEntries, 'key');
    return _.map(keyGroup, (sameKeyEntries, key) => ({
      key,
      value: _.map(sameKeyEntries, 'value')
    }))
  })

  return [mergedObj];
}

// 测试调用
console.log(mergeCategoryArrays(arr1));

方案2:原生JS实现(无第三方依赖)

如果不想引入lodash,用原生的数组方法也可以实现:

function mergeCategoryArrays(arr) {
  const categoryMap = {};

  // 聚合所有分类条目
  arr.forEach(currentObj => {
    Object.entries(currentObj).forEach(([category, entries]) => {
      if (!categoryMap[category]) categoryMap[category] = [];
      categoryMap[category].push(...entries);
    })
  })

  // 按key合并value
  const mergedObj = {};
  Object.entries(categoryMap).forEach(([category, entries]) => {
    const keyMap = {};
    entries.forEach(({key, value}) => {
      if (!keyMap[key]) keyMap[key] = [];
      keyMap[key].push(value);
    })
    mergedObj[category] = Object.entries(keyMap).map(([key, value]) => ({key, value}));
  })

  return [mergedObj];
}

// 测试调用
console.log(mergeCategoryArrays(arr1));

以上两种实现都支持任意数量的分类、任意数量的数组成员合并,value为字符串、数字等基础类型都可以正常收集。

内容的提问来源于stack exchange,提问作者Moaud louhichi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 12:27:07