Lodash:如何使用多个嵌套属性进行分组?

时间:2019-04-14 21:39:34

标签: javascript lodash

尝试使用对象的2个嵌套属性对数组进行分组。以下是我正在使用的数据。 我需要使用嵌套在start对象中的endtime属性对这些数据进行分组

`

[{
    "id": 227,
    "day": 0,
    "time": {
        "id": 31,
        "start": "03:00:00",
        "end": "06:00:00"
    },
    "max_tasks": 3
}, {
    "id": 228,
    "day": 1,
    "time": {
        "id": 31,
        "start": "03:00:00",
        "end": "06:00:00"
    },
    "max_tasks": 3
}, {
    "id": 229,
    "day": 2,
    "time": {
        "id": 31,
        "start": "03:00:00",
        "end": "06:00:00"
    },
    "max_tasks": 3
}, {
    "id": 230,
    "day": 3,
    "time": {
        "id": 31,
        "start": "03:00:00",
        "end": "06:00:00"
    },
    "max_tasks": 3
}, {
    "id": 231,
    "day": 4,
    "time": {
        "id": 31,
        "start": "03:00:00",
        "end": "06:00:00"
    },
    "max_tasks": 3
}, {
    "id": 232,
    "day": 5,
    "time": {
        "id": 31,
        "start": "03:00:00",
        "end": "06:00:00"
    },
    "max_tasks": 3
}, {
    "id": 233,
    "day": 6,
    "time": {
        "id": 31,
        "start": "03:00:00",
        "end": "06:00:00"
    },
    "max_tasks": 3
}, {
    "id": 283,
    "day": 0,
    "time": {
        "id": 39,
        "start": "06:00:00",
        "end": "08:00:00"
    },
    "max_tasks": 3
}, {
    "id": 284,
    "day": 1,
    "time": {
        "id": 39,
        "start": "06:00:00",
        "end": "08:00:00"
    },
    "max_tasks": 3
}, {
    "id": 285,
    "day": 2,
    "time": {
        "id": 39,
        "start": "06:00:00",
        "end": "08:00:00"
    },
    "max_tasks": 3
}, {
    "id": 286,
    "day": 3,
    "time": {
        "id": 39,
        "start": "06:00:00",
        "end": "08:00:00"
    },
    "max_tasks": 3
}, {
    "id": 287,
    "day": 4,
    "time": {
        "id": 39,
        "start": "06:00:00",
        "end": "08:00:00"
    },
    "max_tasks": 3
}, {
    "id": 288,
    "day": 5,
    "time": {
        "id": 39,
        "start": "06:00:00",
        "end": "08:00:00"
    },
    "max_tasks": 3
}, {
    "id": 289,
    "day": 6,
    "time": {
        "id": 39,
        "start": "06:00:00",
        "end": "08:00:00"
    },
    "max_tasks": 3
}]

`

当前,我可以使用以下代码使用一个属性进行分组,但不能同时使用这两个属性:

var result = _.groupBy(this.slots, 'time.start')

预期数据如下所示: `

03: 00: 00 - 06: 00: 00: [{
        "id": 227,
        "day": 0,
        "time": {
            "id": 31,
            "start": "03:00:00",
            "end": "06:00:00"
        },
        "max_tasks": 3
    },
    {
        "id": 228,
        "day": 1,
        "time": {
            "id": 31,
            "start": "03:00:00",
            "end": "06:00:00"
        },
        "max_tasks": 3
    }
]
06: 00: 00 - 08: 00: 00: [{
        "id": 283,
        "day": 0,
        "time": {
            "id": 39,
            "start": "06:00:00",
            "end": "08:00:00"
        },
        "max_tasks": 3
    },
    {
        "id": 284,
        "day": 1,
        "time": {
            "id": 39,
            "start": "06:00:00",
            "end": "08:00:00"
        },
        "max_tasks": 3
    }
]

`

预先感谢:)

2 个答案:

答案 0 :(得分:2)

您可以使用函数library(tidyverse) apollo_tbl <- read_csv("apollo.csv", col_names = TRUE) plot1 <- ggplot(data = apollo_tbl, mapping = aes(x = covpercent, y = dayDifference)) + geom_point() + labs(x = "Cov Percent", y = "Day Difference", title = "Add your title here") ggsave(filename = "apollo_scatter_plot", plot = plot1, device = "png" ) 对这些值进行分组。

reduce
let arr = [{    "id": 227,    "day": 0,    "time": {        "id": 31,        "start": "03:00:00",        "end": "06:00:00"    },    "max_tasks": 3}, {    "id": 228,    "day": 1,    "time": {        "id": 31,        "start": "03:00:00",        "end": "06:00:00"    },    "max_tasks": 3}, {    "id": 229,    "day": 2,    "time": {        "id": 31,        "start": "03:00:00",        "end": "06:00:00"    },    "max_tasks": 3}, {    "id": 230,    "day": 3,    "time": {        "id": 31,        "start": "03:00:00",        "end": "06:00:00"    },    "max_tasks": 3}, {    "id": 231,    "day": 4,    "time": {        "id": 31,        "start": "03:00:00",        "end": "06:00:00"    },    "max_tasks": 3}, {    "id": 232,    "day": 5,    "time": {        "id": 31,        "start": "03:00:00",        "end": "06:00:00"    },    "max_tasks": 3}, {    "id": 233,    "day": 6,    "time": {        "id": 31,        "start": "03:00:00",        "end": "06:00:00"    },    "max_tasks": 3}, {    "id": 283,    "day": 0,    "time": {        "id": 39,        "start": "06:00:00",        "end": "08:00:00"    },    "max_tasks": 3}, {    "id": 284,    "day": 1,    "time": {        "id": 39,        "start": "06:00:00",        "end": "08:00:00"    },    "max_tasks": 3}, {    "id": 285,    "day": 2,    "time": {        "id": 39,        "start": "06:00:00",        "end": "08:00:00"    },    "max_tasks": 3}, {    "id": 286,    "day": 3,    "time": {        "id": 39,        "start": "06:00:00",        "end": "08:00:00"    },    "max_tasks": 3}, {    "id": 287,    "day": 4,    "time": {        "id": 39,        "start": "06:00:00",        "end": "08:00:00"    },    "max_tasks": 3}, {    "id": 288,    "day": 5,    "time": {        "id": 39,        "start": "06:00:00",        "end": "08:00:00"    },    "max_tasks": 3}, {    "id": 289,    "day": 6,    "time": {        "id": 39,        "start": "06:00:00",        "end": "08:00:00"    },    "max_tasks": 3}]
let result = arr.reduce((a, c) => {
  let key = `${c.time.start} - ${c.time.end}`;
  (a[key] || (a[key] = [])).push(c);
  return a;
}, {});

console.log(result);

答案 1 :(得分:2)

_.groupBy()与回调一起使用,并根据startend生成密钥:

const data = [{"id":227,"day":0,"time":{"id":31,"start":"03:00:00","end":"06:00:00"},"max_tasks":3},{"id":228,"day":1,"time":{"id":31,"start":"03:00:00","end":"06:00:00"},"max_tasks":3},{"id":229,"day":2,"time":{"id":31,"start":"03:00:00","end":"06:00:00"},"max_tasks":3},{"id":230,"day":3,"time":{"id":31,"start":"03:00:00","end":"06:00:00"},"max_tasks":3},{"id":231,"day":4,"time":{"id":31,"start":"03:00:00","end":"06:00:00"},"max_tasks":3},{"id":232,"day":5,"time":{"id":31,"start":"03:00:00","end":"06:00:00"},"max_tasks":3},{"id":233,"day":6,"time":{"id":31,"start":"03:00:00","end":"06:00:00"},"max_tasks":3},{"id":283,"day":0,"time":{"id":39,"start":"06:00:00","end":"08:00:00"},"max_tasks":3},{"id":284,"day":1,"time":{"id":39,"start":"06:00:00","end":"08:00:00"},"max_tasks":3},{"id":285,"day":2,"time":{"id":39,"start":"06:00:00","end":"08:00:00"},"max_tasks":3},{"id":286,"day":3,"time":{"id":39,"start":"06:00:00","end":"08:00:00"},"max_tasks":3},{"id":287,"day":4,"time":{"id":39,"start":"06:00:00","end":"08:00:00"},"max_tasks":3},{"id":288,"day":5,"time":{"id":39,"start":"06:00:00","end":"08:00:00"},"max_tasks":3},{"id":289,"day":6,"time":{"id":39,"start":"06:00:00","end":"08:00:00"},"max_tasks":3}]

const result = _.groupBy(data, ({ time: { start, end } }) => `${start} - ${end}`)

console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>