有没有一种方法可以有效地实现按功能分组而不发生突变?
天真的实现:
- 重新编写游乐场
- JavaScript(见下文)
var messages = [
{insertedAt: "2021-01-10"},
{insertedAt: "2021-01-12"},
{insertedAt: "2021-01-13"},
{insertedAt: "2021-01-13"},
{insertedAt: "2021-01-13"},
{insertedAt: "2021-01-14"},
{insertedAt: "2021-01-15"},
{insertedAt: "2021-01-15"},
{insertedAt: "2021-01-16"},
{insertedAt: "2021-01-17"},
{insertedAt: "2021-01-17"},
{insertedAt: "2021-01-17"},
{insertedAt: "2021-01-18"},
{insertedAt: "2021-01-18"},
]
var messagesGroupedByDate = messages.reduce(function (data, message) {
if (
data.some(function (point) {
return point.date === message.insertedAt;
})
) {
return data.map(function (point) {
if (point.date === message.insertedAt) {
return {
date: point.date,
count: (point.count + 1) | 0,
};
} else {
return point;
}
});
} else {
return data.concat([
{
date: message.insertedAt,
count: 1,
},
]);
}
}, []);
console.log(messagesGroupedByDate);
为了争论,没有必要使它更通用。我面临的问题是我循环了三次:
- 一次
Array.prototype.reduce
需要循环messages
- 一次
Array.prototype.some
查看日期键是否已存在于结果数组中 - 在日期键已经存在的情况下,我们再次循环
Array.prototype.map
以更新数组的特定元素 - 否则,返回一个包含新元素的新数组
如果在 ReScript 中没有真正提高效率的好方法,那么我总是可以为这个函数使用原始 JavaScript,但我很好奇是否有可能在没有突变的情况下有效地做到这一点。