繁体   English   中英

在 javascript 中按日期对对象数组进行分组

[英]Group array of objects by date in javascript

在 javascript 中按日期对对象数组进行分组

有三个这样的对象。

var Object1 = [
    {
        "data" : "1-1",
        "createdAt": "2022-03-01",
    },
    {
        "data" : "1-2",
        "createdAt": "2022-03-02",
    },
    {
        "data" : "1-4",
        "createdAt": "2022-03-04",
    },
    {
        "data" : "1-5",
        "createdAt": "2022-03-05",
    },
    {
        "data" : "1-6",
        "createdAt": "2022-03-06",
    },
    {
        "data" : "1-7",
        "createdAt": "2022-03-07",
    }
];

var Object2 = [
    {
        "data" : "2-1",
        "createdAt": "2022-03-02",
    },
    {
        "data" : "2-2",
        "createdAt": "2022-03-03",
    },
    {
        "data" : "2-3",
        "createdAt": "2022-03-04",
    },
    {
        "data" : "2-4",
        "createdAt": "2022-03-05",
    },
    {
        "data" : "2-5",
        "createdAt": "2022-03-06",
    },
    {
        "data" : "2-6",
        "createdAt": "2022-03-07",
    },
    {
        "data" : "2-7",
        "createdAt": "2022-03-08",
    }
];

var Object3 = [
    {
        "data" : "3-1",
        "createdAt": "2022-03-03",
    },
    {
        "data" : "3-2",
        "createdAt": "2022-03-04",
    },
    {
        "data" : "3-3",
        "createdAt": "2022-03-05",
    },
    {
        "data" : "3-4",
        "createdAt": "2022-03-06",
    },
    {
        "data" : "3-5",
        "createdAt": "2022-03-07",
    },
    {
        "data" : "3-6",
        "createdAt": "2022-03-08",
    },
    {
        "data" : "3-7",
        "createdAt": "2022-03-09",
    }
];

我想像这样对它们进行分组:

var result = [
    {
        "Object1" : "1-1",
        "Object2" : undefined or null,
        "Object3" :  undefined or null,
        "createdAt": "2022-03-01",
    },
    {
        "Object1" : "1-2",
        "Object2" : "2-1",
        "Object3" :  undefined or null,
        "createdAt": "2022-03-02",
    },
    {
        "Object1" : undefined or null,
        "Object2" : "2-2",
        "Object3" : "3-1",
        "createdAt": "2022-03-03",
    },
    {
        "Object1" : "1-4",
        "Object2" : "2-3",
        "Object3" : "3-2",
        "createdAt": "2022-03-04",
    },
    {
        "Object1" : "1-5",
        "Object2" : "2-4",
        "Object3" : "3-3",
        "createdAt": "2022-03-05",
    },
    {
        "Object1" : "1-6",
        "Object2" : "2-5",
        "Object3" : "3-4",
        "createdAt": "2022-03-06",
    },
    {
        "Object1" : "1-7",
        "Object2" : "2-6",
        "Object3" : "3-5",
        "createdAt": "2022-03-07",
    },
    {
        "Object1" : undefined or null,
        "Object2" : "2-7",
        "Object3" : "3-6",
        "createdAt": "2022-03-08",
    },
    {
        "Object1" : undefined or null,
        "Object2" : undefined or null,
        "Object3" : "3-7",
        "createdAt": "2022-03-09",
    },
]

我想按日期对 n arrays 进行分组。

但是每个数组里面的日期也会不一样,不知道有没有数据。 中间可能日期是空的,也可能数据是空的。 如果时、分、秒数据混合,则不按日期分组。

我想我可以使用 foreach 循环,但我不知道我错过了什么。 有人知道这个问题的答案吗?

这是一个相当标准的“分组依据”,但由于您有多个 arrays 并且您希望将它们的变量名用作属性,因此您需要一种机制来执行此操作。

下面的示例首先使用速记属性名称从三个 arrays 创建一个 object,然后迭代此 object 的Object.entries()以按日期分组,通过变量名称作为键分配数据。 为了确保所有对象都具有所有数组属性,即使它们没有相关条目,它也会从组合 object 的Object.keys()创建一个template object,并将其传播到分组操作中的每个累加器中。

 const Object1 = [{ "data": "1-1", "createdAt": "2022-03-01", }, { "data": "1-2", "createdAt": "2022-03-02", }, { "data": "1-4", "createdAt": "2022-03-04", }, { "data": "1-5", "createdAt": "2022-03-05", }, { "data": "1-6", "createdAt": "2022-03-06", }, { "data": "1-7", "createdAt": "2022-03-07", }]; const Object2 = [{ "data": "2-1", "createdAt": "2022-03-02", }, { "data": "2-2", "createdAt": "2022-03-03", }, { "data": "2-3", "createdAt": "2022-03-04", }, { "data": "2-4", "createdAt": "2022-03-05", }, { "data": "2-5", "createdAt": "2022-03-06", }, { "data": "2-6", "createdAt": "2022-03-07", }, { "data": "2-7", "createdAt": "2022-03-08", }]; const Object3 = [{ "data": "3-1", "createdAt": "2022-03-03", }, { "data": "3-2", "createdAt": "2022-03-04", }, { "data": "3-3", "createdAt": "2022-03-05", }, { "data": "3-4", "createdAt": "2022-03-06", }, { "data": "3-5", "createdAt": "2022-03-07", }, { "data": "3-6", "createdAt": "2022-03-08", }, { "data": "3-7", "createdAt": "2022-03-09", }]; const objects = { Object1, Object2, Object3 }; const template = Object.fromEntries(Object.keys(objects).map(k => [k, undefined])); const grouped = {}; for (const [objGroup, objArr] of Object.entries(objects)) { for (const { createdAt, data } of objArr) { const group = grouped[createdAt]??= {...template, createdAt }; group[objGroup] = data; } } const result = Object.values(grouped); console.log(result);

至于你含糊不清的说法, ‘中间可能日期是空的,也可能是数据是空的。 如果小时、分钟和秒数据混合在一起,则它们不会按日期分组 ' ,没有实际数据就无法添加任何内容,但您需要确定一个稳定的属性才能准确分组。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM