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

如何按fromCurrencyId、toCurrencyId多字段拆分对象数组?

按双字段分组数组对象

问题场景

我有一个包含大量对象的数组,结构如下:

[
  {
    startAt: "2016-01-01 11:35:00",
    fromCurrencyId: "a49cd579-18ea-44cb-8117-86428b64a27a",
    toCurrencyId: "c5a0c46c-c5b5-49a5-9a16-4a829269583e"
  },
  {
    startAt: "2016-01-01 11:40:00",
    fromCurrencyId: "a49cd579-18ea-44cb-8117-86428b64a27a",
    toCurrencyId: "c5a0c46c-c5b5-49a5-9a16-4a829269583e"
  },
  {
    startAt: "2016-01-01 12:00:00",
    fromCurrencyId: "c5a0c46c-c5b5-49a5-9a16-4a829269583e",
    toCurrencyId: "5491dfe0-7d61-407d-b642-7fd3ec905302"
  },
  {
    startAt: "2016-01-01 12:40:00",
    fromCurrencyId: "c5a0c46c-c5b5-49a5-9a16-4a829269583e",
    toCurrencyId: "5491dfe0-7d61-407d-b642-7fd3ec905302"
  },
  {
    startAt: "2016-01-01 11:40:00",
    fromCurrencyId: "a49cd579-18ea-44cb-8117-86428b64a27a",
    toCurrencyId: "5491dfe0-7d61-407d-b642-7fd3ec905302"
  },
  ...
]

预期效果

需要按照fromCurrencyId和toCurrencyId两个字段将数组拆分为子数组,最终结果如下:

[
  [
    {
      startAt: "2016-01-01 11:35:00",
      fromCurrencyId: "a49cd579-18ea-44cb-8117-86428b64a27a",
      toCurrencyId: "c5a0c46c-c5b5-49a5-9a16-4a829269583e"
    },
    {
      startAt: "2016-01-01 11:40:00",
      fromCurrencyId: "a49cd579-18ea-44cb-8117-86428b64a27a",
      toCurrencyId: "c5a0c46c-c5b5-49a5-9a16-4a829269583e"
    }
  ],
  [
    {
      startAt: "2016-01-01 12:00:00",
      fromCurrencyId: "c5a0c46c-c5b5-49a5-9a16-4a829269583e",
      toCurrencyId: "5491dfe0-7d61-407d-b642-7fd3ec905302"
    },
    {
      startAt: "2016-01-01 12:40:00",
      fromCurrencyId: "c5a0c46c-c5b5-49a5-9a16-4a829269583e",
      toCurrencyId: "5491dfe0-7d61-407d-b642-7fd3ec905302"
    }
  ],
  [
    {
      startAt: "2016-01-01 11:40:00",
      fromCurrencyId: "a49cd579-18ea-44cb-8117-86428b64a27a",
      toCurrencyId: "5491dfe0-7d61-407d-b642-7fd3ec905302"
    }
  ]
]

我的尝试

我尝试用lodash的groupBy方法实现,但没得到预期结果,代码如下:

const props = ['fromCurrencyId', 'toCurrencyId']

const a = _.groupBy(data, function(note){
  return _.find(_.pick(note, props));
});

解决方案

方法一:使用Lodash实现

之前的问题在于_.find(_.pick(note, props))只返回了第一个属性的值,无法区分两个字段的组合。正确的做法是将两个字段的值拼接成唯一的分组键:

const props = ['fromCurrencyId', 'toCurrencyId'];
// 按双字段组合分组
const groupedObj = _.groupBy(data, item => `${item[props[0]]}-${item[props[1]]}`);
// 将分组对象转换为二维数组,匹配预期结果
const result = Object.values(groupedObj);

方法二:原生JavaScript实现

不用Lodash的话,可以用Array.reduce手动完成分组:

const props = ['fromCurrencyId', 'toCurrencyId'];
// 分组为对象结构
const groupedObj = data.reduce((acc, item) => {
  const key = `${item[props[0]]}-${item[props[1]]}`;
  if (!acc[key]) {
    acc[key] = [];
  }
  acc[key].push(item);
  return acc;
}, {});
// 转换为二维数组
const result = Object.values(groupedObj);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 11:40:35