【发布时间】:2018-10-12 14:50:16
【问题描述】:
我们有一个对象数组,我们需要按组 ID 对这些对象进行分组。
然后我们需要得到一个按时间戳排序的数组数组。
这是初始集合:
const arr = [
{id: 'id1', group: '123', timestamp: 222},
{id: 'id2', group: '123', timestamp: 999 },
{id: 'id3', group: '456', timestamp: 333 },
{id: 'id4', group: '789', timestamp: 111 },
{id: 'id5', group: '554', timestamp: 555 },
];
我们尝试得到的结果是:
result = [
[
{id: 'id4', group: '789', timestamp: 111 },
],
[
{id: 'id1', group: '123', timestamp: 222},
{id: 'id2', group: '123', timestamp: 999 },
],
[
{id: 'id3', group: '456', timestamp: 333 },
],
[
{id: 'id5', group: '554', timestamp: 555 },
]
]
我们使用 Underscore.js 实现了这一点,但我们正在寻找使用本机 javascript 的解决方案,并且我们很难从简化对象传递到数组数组。
var groups = _(arr).chain()
.groupBy("group")
.sortBy((data) => _.first(data).timestamp)
.value();
https://jsfiddle.net/tdsow1ph/
我们首先尝试使用这种方法对项目进行分组:
const groupBy = (arr, propertyToGroupBy) => {
return arr.reduce((groups, item) => {
const val = item[propertyToGroupBy];
groups[val] = groups[val] || [];
groups[val].push(item);
return groups;
}, {});
}
但是我们得到了一个不可排序的对象。所以我们需要将其转换为数组数组,但我们很难做到这一点,然后对时间戳值应用排序。
【问题讨论】:
-
先排序再分组可能更容易。
标签: javascript ecmascript-6 underscore.js lodash