有没有一种方法可以有效地实现按功能分组而不发生突变?
天真的实现:
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,但我很好奇是否有可能在没有突变的情况下有效地做到这一点。
最佳答案
只需将数据添加到 Map()
然后转换为数组,然后转换为对象。它不会根据您的要求改变任何内容。
我们可以进一步简化这一点,但现在是凌晨 5:00,我的大脑现在睡着了。
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"},
];
const mapped = new Map();
messages.forEach(message => {
// if date already seen before, increment the count
if (mapped.has(message.insertedAt)) {
const count = mapped.get(message.insertedAt);
mapped.set(message.insertedAt, count+1);
} else {
// date never seen before, add to map with initial count
mapped.set(message.insertedAt, 1);
}
});
const msgArr = Array.from(mapped);
const final = msgArr.map(([date, count])=> ({date, count}));
console.log(final);
关于javascript - 如何在没有突变的情况下按功能创建有效的组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65783074/