【发布时间】:2019-11-28 03:12:03
【问题描述】:
我有以下算法基础问题,我正在尝试用 ES6 解决它,但我对 groupBy 感到困惑,
let data = [
{id: "2", time: "3/11/2016 02:02:58", value: 7.0},
{id: "1", time: "3/11/2016 02:12:32", value: 6.5},
{id: "1", time: "3/11/2016 02:13:11", value: 7.25},
{id: "4", time: "3/11/2016 02:13:54", value: 8.75},
{id: "2", time: "3/11/2016 05:02:45", value: 11.0},
{id: "4", time: "3/11/2016 06:32:42", value: 5.0},
{id: "2", time: "3/11/2016 06:35:12", value: 2.0},
{id: "1", time: "3/11/2016 06:45:01", value: 12.0},
{id: "1", time: "3/11/2016 06:59:59", value: 11.75},
{id: "2", time: "3/11/2016 07:01:53", value: 1.0},
{id: "1", time: "3/11/2016 07:02:54", value: 4.5},
{id: "3", time: "3/11/2016 07:02:54", value: 15.75},
{id: "6", time: "3/11/2016 07:02:54", value: 14.25},
{id: "2", time: "3/11/2016 07:03:15", value: 12.0},
{id: "2", time: "3/11/2016 08:02:22", value: 3.0},
{id: "2", time: "3/11/2016 09:41:50", value: 4.0},
{id: "2", time: "3/11/2016 10:02:54", value: 5.0},
{id: "2", time: "3/11/2016 11:05:35", value: 10.0},
{id: "2", time: "3/11/2016 13:02:21", value: 6.0},
{id: "5", time: "3/11/2016 13:02:40", value: 8.0},
{id: "4", time: "3/11/2016 13:02:55", value: 8.0},
{id: "5", time: "3/11/2016 13:33:34", value: 8.0},
{id: "5", time: "3/11/2016 13:42:24", value: 8.0},
{id: "5", time: "3/11/2016 13:47:44", value: 6.25},
{id: "5", time: "3/11/2016 14:02:54", value: 4.25},
{id: "5", time: "3/11/2016 14:03:04", value: 5.25},
{id: "5", time: "3/11/2016 15:12:55", value: 6.25},
{id: "2", time: "3/11/2016 16:02:36", value: 8.0},
{id: "5", time: "3/11/2016 16:22:11", value: 8.5},
{id: "5", time: "3/11/2016 17:18:19", value: 11.25},
{id: "5", time: "3/11/2016 18:19:20", value: 9.0},
{id: "2", time: "3/11/2016 23:59:59", value: 9.0}
];
尝试获取具有以下条件的数组子集:
- 每一个小时内的每个
id,只有最昂贵的值应该在结果集中。 - 如果多个具有相同
id的对象在一小时内等于最昂贵的值,则仅放置最早的对象。 - 如果整个对象数组中
id的对象超过8 个,则将其删除。
我知道在 SQL 中使用 'value' 上的 MAX 和 'time' 列上的 GroupBy 是如何轻松实现的,但在这里我对 JS 循环感到困惑。如果可能,请提出一些技巧。
我正在尝试如下,但似乎还有很长的路要走
var newArr = [];
data.forEach(function (el) {
var findIndex = newArr.findIndex(function (item) {
return item.time === el.time;
});
if (findIndex === -1) {
newArr.push(el);
} else if (el.value > newArr[findIndex].value) {
newArr[findIndex].value = el.value;
newArr[findIndex].time = el.time;
} else {
newArr[findIndex].time = el.time;
}
});
只是为了让它更清晰输出会是这样的
[
{ id: "4",time: "3/11/2016 02:13:54",value: 8.75 },
{ id: "1", time: "3/11/2016 06:45:01",value: 12.0 },
{ id: "3",time: "3/11/2016 07:02:54",value: 15.75 },
{ id: "4", time: "3/11/2016 13:02:55", value: 8.0}
]
id 的记录:“2”和“5”被删除,因为它有超过 8 个出现 我找到了 here 的东西,但看起来像红宝石
【问题讨论】:
-
@Spangle 看看我编辑的问题.. 希望你明白我在尝试什么
-
你在 sn-p 中的哪个位置尝试检查是否有超过 8 个具有相同 id 的对象?
-
我建议为此使用像 moment 和 lodash 这样的库。
-
对于第 3 点。删除...基于什么条件?最低的
value还是最旧的time? -
删除应该基于如果在数组中重复超过8次..
标签: javascript arrays ecmascript-6 javascript-objects