在对象数组中合并JavaScript日期对象

cigdeys3  于 2023-01-11  发布在  Java
关注(0)|答案(4)|浏览(184)

我正在开发应用程序,希望显示3列

date, min and zone

我得到了一个对象数组

[
{date: 2022-12-28T07:37:16.859Z, min: 2, zone: zone A},
{date: 2022-12-28T07:38:13.859Z, min: 1, zone: zone B},
{date: 2022-12-28T07:36:15.859Z, min: 3, zone: zone C},
{date: 2022-12-31T07:37:16.859Z, min: 2, zone: zone E}
{date: 2022-12-25T07:37:16.859Z, min: 4, zone: zone D}
]

我想投保以下条款:
1.如果日期重复,则应仅重复一次。
1.具有相同日期的分钟数应为加法,如(2+1+3=6)
1.具有相同日期的区域应连续(区域A、区域B、区域C)
并且想要如下的结果:

[
    {date: 2022-12-28T07:37:16.859Z, min: 6, zone: zone A, zone B, zone C},
    {date: 2022-12-31T07:37:16.859Z, min: 2, zone: zone E}
    {date: 2022-12-25T07:37:16.859Z, min: 4, zone: zone D}
    ]

任何帮助我都感激不尽。

wztqucjr

wztqucjr1#

过滤掉具有重复日期的元素,当您删除它们时,将min/zone值添加/concat到剩余对象的相应值中。
How to remove duplicates

yr9zkbsy

yr9zkbsy2#

首先,你需要根据代码中的管理条件来格式化日期

a = [
  {date: "2022-12-28", min: 2, zone: "zone A"},
  {date: "2022-12-28", min: 1, zone: "zone B"},
  {date: "2022-12-28", min: 3, zone: "zone C"},
  {date: "2022-12-31", min: 2, zone: "zone E"},
  {date: "2022-12-25", min: 4, zone: "zone D"}
]

let h = []
a.forEach(item => {
    let data = h.find(e => e.date == item.date);
    if(data){
        data.min = data.min + item.min;
        data.zone = data.zone + ", " + item.zone;
        let index = h.findIndex(e => e.date == item.date);
        h[index] = data
    }else
        h.push(item)
})
console.log(h)
uemypmqf

uemypmqf3#

所需结果需要按date分组(仅限日期)。
可以使用.reduce()date对数据进行分组。
1.当组中找不到date元素时,需要创建一个kv对象,然后将其压入累加器(acc)数组。
1.当现有组中存在与date匹配的元素时,需要更新minzoneacc数组中的现有元素。
最后,需要从groupedDate数组中获取所有v值。

let input = [
    { date: "2022-12-28T07:37:16.859Z", min: 2, zone: "zone A" },
    { date: "2022-12-28T07:38:13.859Z", min: 1, zone: "zone B" },
    { date: "2022-12-28T07:36:15.859Z", min: 3, zone: "zone C" },
    { date: "2022-12-31T07:37:16.859Z", min: 2, zone: "zone E" },
    { date: "2022-12-25T07:37:16.859Z", min: 4, zone: "zone D" }
];

let groupedDate = input.reduce(
    (acc: { k: string, v: { date: string; min: number; zone: string[] } }[], 
    cur: { date: string, min: number, zone: string }) => {

    let date = new Date(cur.date);
    let dateString = `${date.getFullYear()}-${date.getMonth() + 1}-${date.getDate()}`;

    let index = acc.findIndex(x => x.k == dateString);
    if (index > -1) {
        acc[index].v.min += cur.min;
        acc[index].v.zone.push(cur.zone);
    } else {
        acc.push({
            k: dateString,
            v: { date: cur.date, min: cur.min, zone: [cur.zone] }
        });
    }

    return acc;
}, []);

let result = groupedDate.map(x => x.v);

在TypeScriptPlayground演示

moiiocjp

moiiocjp4#

可以使用Array.map()方法创建一个新的对象数组,该数组将JavaScript Date对象与其他属性组合在一起。

let dateArray = [new Date(), new Date(), new Date()];

let dataArray = dateArray.map(date => {
  return {
    date: date,
    value: Math.random()
  }
});

相关问题