使用 reduce 在 2 个属性上按数组分组

Group-by array on 2 properties with reduce

我想按 2 个属性对一组对象进行分组。我怎样才能做到这一点?

我得到了这个数组:

[
    {
        "nome": "Beatrice Mattos",
        "apelido": "Beatrice",
        "dt_extrato": "2020-05-26T00:00:00",
        "dt_inicio": "2020-05-26T15:00:00",
        "Servico": "Corte Masculino"
    },
    {
        "nome": "Davi",
        "apelido": "Davi",
        "dt_extrato": "2020-05-26T00:00:00",
        "dt_inicio": "2020-05-26T14:00:00",
        "Servico": "Corte Masculino"
    },
    {
        "nome": "Kai",
        "apelido": "Martins",
        "dt_extrato": "2020-05-26T00:00:00",
        "dt_inicio": "2020-05-26T13:30:00",
        "Servico": "Barba Completa"
    },
    {
        "nome": "Beatrice Mattos",
        "apelido": "Beatrice",
        "dt_extrato": "2020-05-26T00:00:00",
        "dt_inicio": "2020-05-26T09:30:00",
        "Servico": "Corte Masculino"
    },
    {
        "nome": "Beatrice Mattos",
        "apelido": "Beatrice",
        "dt_extrato": "2020-05-26T00:00:00",
        "dt_inicio": "2020-05-26T09:00:00",
        "Servico": "Alongamento de Cabelo"
    },
    {
        "nome": "Beatrice Mattos",
        "apelido": "Beatrice",
        "dt_extrato": "2020-05-26T00:00:00",
        "dt_inicio": "2020-05-26T08:00:00",
        "Servico": "Corte Masculino"
    },
    {
        "nome": "Estevan Alves",
        "apelido": "Estevan",
        "dt_extrato": "2020-05-25T00:00:00",
        "dt_inicio": "2020-05-25T08:40:00",
        "Servico": "Corte Masculino"
    },
    {
        "nome": "Kai",
        "apelido": "Martins",
        "dt_extrato": "2020-05-25T00:00:00",
        "dt_inicio": "2020-05-25T08:30:00",
        "Servico": "Corte Masculino"
    },
    {
        "nome": "Estevan Alves",
        "apelido": "Estevan",
        "dt_extrato": "2020-05-25T00:00:00",
        "dt_inicio": "2020-05-25T08:00:00",
        "Servico": "Corte Masculino"
    }
]

我想把它转换成这个对象:

{
"2020-05-26T00:00:00": [{
    "Beatrice Mattos": [
        {
            "nome": "Beatrice Mattos",
            "apelido": "Beatrice",
            "dt_extrato": "2020-05-26T00:00:00",
            "dt_inicio": "2020-05-26T15:00:00",
            "Servico": "Corte Masculino"
        },
        {
            "nome": "Beatrice Mattos",
            "apelido": "Beatrice",
            "dt_extrato": "2020-05-26T00:00:00",
            "dt_inicio": "2020-05-26T09:30:00",
            "Servico": "Corte Masculino"
        },
        {
            "nome": "Beatrice Mattos",
            "apelido": "Beatrice",
            "dt_extrato": "2020-05-26T00:00:00",
            "dt_inicio": "2020-05-26T09:00:00",
            "Servico": "Alongamento de Cabelo"
        },
        {
            "nome": "Beatrice Mattos",
            "apelido": "Beatrice",
            "dt_extrato": "2020-05-26T00:00:00",
            "dt_inicio": "2020-05-26T08:00:00",
            "Servico": "Corte Masculino"
        }
    ],
    "Davi": [
        {
            "nome": "Davi",
            "apelido": "Davi",
            "dt_extrato": "2020-05-26T00:00:00",
            "dt_inicio": "2020-05-26T14:00:00",
            "Servico": "Corte Masculino"
        }
    ],
    "Kai": [
        {
            "nome": "Kai",
            "apelido": "Martins",
            "dt_extrato": "2020-05-26T00:00:00",
            "dt_inicio": "2020-05-26T13:30:00",
            "Servico": "Barba Completa"
        }
    ]
}],
"2020-05-25T00:00:00": [{
    "Kai": [
        {
            "nome": "Kai",
            "apelido": "Martins",
            "dt_extrato": "2020-05-26T00:00:00",
            "dt_inicio": "2020-05-26T13:30:00",
            "Servico": "Barba Completa"
        },
        {
            "nome": "Kai",
            "apelido": "Martins",
            "dt_extrato": "2020-05-25T00:00:00",
            "dt_inicio": "2020-05-25T08:30:00",
            "Servico": "Corte Masculino"
        }
    ],
    "Estevan Alves": [
        {
            "nome": "Estevan Alves",
            "apelido": "Estevan",
            "dt_extrato": "2020-05-25T00:00:00",
            "dt_inicio": "2020-05-25T08:40:00",
            "Servico": "Corte Masculino"
        },
        {
            "nome": "Estevan Alves",
            "apelido": "Estevan",
            "dt_extrato": "2020-05-25T00:00:00",
            "dt_inicio": "2020-05-25T08:00:00",
            "Servico": "Corte Masculino"
        }
    ]
}]

}

我的目标是按日期和名称对服务进行分组。我只能按一个或另一个分组,不能同时分组。

要按字段 'name' 分组,我使用以下代码:

 this.name_group = this.array.reduce((data, object) => {
      data[object.nome] = [...data[object.nome] || [], object];
      return data;
    }, {});

要按字段 'dt_extrato' 分组,我使用以下代码:

 this.date_group = this.array.reduce((data, object) => {
      data[object.dt_extrato] = [...data[object.dt_extrato] || [], object];
      return data;
    }, {});

但我无法将两者分组,嵌套。这可能只使用 reduce 吗?

谢谢

如果您想获得中间没有数组的嵌套对象,您可以使用嵌套键数组来采用这种方法。

var data = [{ nome: "Beatrice Mattos", apelido: "Beatrice", dt_extrato: "2020-05-26T00:00:00", dt_inicio: "2020-05-26T15:00:00", Servico: "Corte Masculino" }, { nome: "Davi", apelido: "Davi", dt_extrato: "2020-05-26T00:00:00", dt_inicio: "2020-05-26T14:00:00", Servico: "Corte Masculino" }, { nome: "Kai", apelido: "Martins", dt_extrato: "2020-05-26T00:00:00", dt_inicio: "2020-05-26T13:30:00", Servico: "Barba Completa" }, { nome: "Beatrice Mattos", apelido: "Beatrice", dt_extrato: "2020-05-26T00:00:00", dt_inicio: "2020-05-26T09:30:00", Servico: "Corte Masculino" }, { nome: "Beatrice Mattos", apelido: "Beatrice", dt_extrato: "2020-05-26T00:00:00", dt_inicio: "2020-05-26T09:00:00", Servico: "Alongamento de Cabelo" }, { nome: "Beatrice Mattos", apelido: "Beatrice", dt_extrato: "2020-05-26T00:00:00", dt_inicio: "2020-05-26T08:00:00", Servico: "Corte Masculino" }, { nome: "Estevan Alves", apelido: "Estevan", dt_extrato: "2020-05-25T00:00:00", dt_inicio: "2020-05-25T08:40:00", Servico: "Corte Masculino" }, { nome: "Kai", apelido: "Martins", dt_extrato: "2020-05-25T00:00:00", dt_inicio: "2020-05-25T08:30:00", Servico: "Corte Masculino" }, { nome: "Estevan Alves", apelido: "Estevan", dt_extrato: "2020-05-25T00:00:00", dt_inicio: "2020-05-25T08:00:00", Servico: "Corte Masculino" }],
    keys = ['dt_extrato', 'nome'],
    result = data.reduce((r, object) => {
        keys
            .reduce((group, key, index, { length }) =>
                group[object[key]] = group[object[key]] || (index + 1 === length
                    ? []
                    : {}
                ), r)
            .push(object);
        return r;
    }, {});
 
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }