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

如何用reduce合并对象数组生成指定结构?已写代码遇阻

问题:将对象数组按时间规则合并分组

我尝试用reduce把对象数组转成预期格式,目前实现了按validFrom字段分组,但后续推进不了,试了map也没效果,求帮忙。

输入数组

const inputArray = [
  {
    "day": "Wednesday",
    "closeTime": "2000",
    "openTime": "0800",
    "validFrom": "2001-09-19",
    "validTo": "2099-12-31"
  },
  {
    "day": "Tuesday",
    "closeTime": "2000",
    "openTime": "0800",
    "validFrom": "2001-09-19",
    "validTo": "2099-12-31"
  },
  {
    "day": "Sunday",
    "closeTime": "1630",
    "openTime": "0845",
    "validFrom": "2001-09-19",
    "validTo": "2099-12-31"
  },
  {
    "day": "Thursday",
    "closeTime": "2000",
    "openTime": "0800",
    "validFrom": "2001-09-19",
    "validTo": "2099-12-31"
  },
  {
    "day": "Friday",
    "closeTime": "2000",
    "openTime": "0800",
    "validFrom": "2001-09-19",
    "validTo": "2099-12-31"
  },
  {
    "day": "Saturday",
    "closeTime": "1630",
    "openTime": "0845",
    "validFrom": "2001-09-19",
    "validTo": "2099-12-31"
  },
  {
    "day": "Monday",
    "closeTime": "2000",
    "openTime": "0800",
    "validFrom": "2001-09-19",
    "validTo": "2099-12-31"
  }
];

已用代码

let clubbedArray = normalData.reduce((acc, temp) => { let { validFrom, day } = temp; return {...acc, [validFrom]: [...(acc[validFrom] || []), day]}; }, {});

预期输出

[
  {
    "day": [
      "Friday",
      "Wednesday",
      "Monday",
      "Tuesday",
      "Thursday"
    ],
    "closeTime": "2000",
    "openTime": "0800",
    "validFrom": "2001-09-19",
    "validTo": "2099-12-31"
  },
  {
    "day": [
      "Saturday",
      "Sunday"
    ],
    "closeTime": "1630",
    "openTime": "0845",
    "validFrom": "2001-09-19",
    "validTo": "2099-12-31"
  }
]

解决方案

你的核心需求是按openTime、closeTime、validFrom、validTo这一组相同字段来合并day数组,之前的代码仅按validFrom分组,忽略了时间规则的组合,所以无法得到预期结果。

可以通过调整reduce的分组key来实现:

const result = Object.values(inputArray.reduce((acc, item) => {
  // 用所有公共字段组合作为分组标识,确保相同规则的项被分到同一组
  const groupKey = `${item.openTime}-${item.closeTime}-${item.validFrom}-${item.validTo}`;
  
  if (!acc[groupKey]) {
    // 初始化分组对象,复制公共字段并将day设为空数组
    acc[groupKey] = {
      ...item,
      day: []
    };
  }
  
  // 将当前项的day添加到分组的day数组中
  acc[groupKey].day.push(item.day);
  
  return acc;
}, {}));

代码说明

  1. 分组key设计:用openTime+closeTime+validFrom+validTo的组合字符串作为key,确保只有完全相同的时间规则才会被合并。
  2. 初始化分组:当首次遇到某个分组key时,创建新的分组对象,复制当前项的公共字段,并初始化day数组。
  3. 合并day字段:后续遇到同组的项时,直接将day字段推入分组的day数组。
  4. 转换为数组:最后用Object.values()将分组对象转换为数组,得到预期的输出格式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 20:04:54