如果存在重复项,如何按日期分组并添加计数



我有一个这样的数据集:

[
{
"Happy": 1,
"createdAt": "2021-12-20"
},
{
"Tired": 1,
"createdAt": "2021-12-14"
},
{
"Energetic": 1,
"createdAt": "2021-12-13",
"Anxious": 1
},
{
"Energetic": 1,
"createdAt": "2021-12-13",
"Anxious": 1
},
{
"Tired": 1,
"createdAt": "2021-12-09",
"Anxious": 1
},
{
"Tired": 1,
"createdAt": "2021-12-09",
"Anxious": 1
},
{
"Sad": 1,
"createdAt": "2021-12-09"
},
{
"Sad": 1,
"createdAt": "2021-12-08"
},
{
"Happy": 1,
"createdAt": "2021-12-08"
},
{
"Anxious": 1,
"createdAt": "2021-12-08"
},
{
"Happy": 1,
"createdAt": "2021-12-08"
},
{
"Tired": 1,
"createdAt": "2021-12-08"
},
{
"Energetic": 1,
"createdAt": "2021-12-08"
},
{
"Anxious": 1,
"createdAt": "2021-12-08"
},
{
"Happy": 1,
"createdAt": "2021-12-08"
},
{
"Sad": 1,
"createdAt": "2021-12-08"
},
{
"Happy": 1,
"createdAt": "2021-12-08"
},
{
"Happy": 1,
"createdAt": "2021-12-08"
},
{
"Anxious": 1,
"createdAt": "2021-12-08"
},
{
"Sad": 1,
"createdAt": "2021-12-08"
},
{
"Anxious": 1,
"createdAt": "2021-12-08"
},
{
"Anxious": 1,
"createdAt": "2021-12-08"
},
{
"Tired": 1,
"createdAt": "2021-12-08"
},
{
"Anxious": 1,
"createdAt": "2021-12-08"
},
{
"Anxious": 1,
"createdAt": "2021-12-08"
}
]

我想做的是按createdAt将其分组,如果在所述日期内有重复的密钥,则将重复的密钥添加到一起。例如:

{
"Energetic": 1,
"createdAt": "2021-12-13",
"Anxious": 1
},
{
"Energetic": 1,
"createdAt": "2021-12-13",
"Anxious": 1
},

将是

{
'Tired': 2,
'Anxious': 2,
'createdAt': '2021-12-13'
}

另一个例子:

{
"Sad": 1,
"createdAt": "2021-12-08"
},
{
"Happy": 1,
"createdAt": "2021-12-08"
},
{
"Anxious": 1,
"createdAt": "2021-12-08"
},
{
"Happy": 1,
"createdAt": "2021-12-08"
},
{
"Tired": 1,
"createdAt": "2021-12-08"
},
{
"Energetic": 1,
"createdAt": "2021-12-08"
},
{
"Anxious": 1,
"createdAt": "2021-12-08"
},
{
"Happy": 1,
"createdAt": "2021-12-08"
},
{
"Sad": 1,
"createdAt": "2021-12-08"
},
{
"Happy": 1,
"createdAt": "2021-12-08"
},
{
"Happy": 1,
"createdAt": "2021-12-08"
},
{
"Anxious": 1,
"createdAt": "2021-12-08"
},
{
"Sad": 1,
"createdAt": "2021-12-08"
},
{
"Anxious": 1,
"createdAt": "2021-12-08"
},
{
"Anxious": 1,
"createdAt": "2021-12-08"
},
{
"Tired": 1,
"createdAt": "2021-12-08"
},
{
"Anxious": 1,
"createdAt": "2021-12-08"
},
{
"Anxious": 1,
"createdAt": "2021-12-08"
}

看起来像

{
'Sad': 3,
'Anxious': 7,
'Happy': 5,
'Tired': 2,
'Energetic': 1,
'createdAt': '2021-12-08',
}

到目前为止,我能够得到这样的数据集:

response.value.reduce((acc, val) => {
acc[toMoodMap(val) as string] = acc[val] === undefined ? 1 : (acc[val] += 1);
acc['createdAt'] = assessment.createdAt;
moodArr.push(acc);
return acc;
}, {});

我知道lodash的groupBy,但不幸的是,我目前无法使用它。有没有办法达到最终结果?

  • 使用Array#reduce,在更新Map的同时迭代数组,其中createdAt是键,分组对象是值。
    • 在每次迭代中,使用Map#get,获取映射值,该映射值的关键字是当前createdAt,否则为具有createdAt的回退对象
    • 使用Object#entriesArray#forEach,迭代当前对象的其余属性并递增值
    • 使用Map#set更新当前对
  • 使用Map#values,返回按createdAt分组的对象列表

const arr = [ { "Sad": 1, "createdAt": "2021-12-08" }, { "Happy": 1, "createdAt": "2021-12-08" }, { "Anxious": 1, "createdAt": "2021-12-08" }, { "Happy": 1, "createdAt": "2021-12-08" }, { "Tired": 1, "createdAt": "2021-12-08" }, { "Energetic": 1, "createdAt": "2021-12-08" }, { "Anxious": 1, "createdAt": "2021-12-08" }, { "Happy": 1, "createdAt": "2021-12-08" }, { "Sad": 1, "createdAt": "2021-12-08" }, { "Happy": 1, "createdAt": "2021-12-08" }, { "Happy": 1, "createdAt": "2021-12-08" }, { "Anxious": 1, "createdAt": "2021-12-08" }, { "Sad": 1, "createdAt": "2021-12-08" }, { "Anxious": 1, "createdAt": "2021-12-08" }, { "Anxious": 1, "createdAt": "2021-12-08" }, { "Tired": 1, "createdAt": "2021-12-08" }, { "Anxious": 1, "createdAt": "2021-12-08" }, { "Anxious": 1, "createdAt": "2021-12-08" } ];
const res = [...
arr.reduce((map, { createdAt, ...e }) => {
const current = map.get(createdAt) ?? { createdAt };
Object.entries(e).forEach(([key, value]) => current[key] = (current[key] ?? 0) + value);
map.set(createdAt, current);
return map;
}, new Map)
.values()
];
console.log(res);

你做得对!您只想使用Object.values从最终分组的对象中获得数组,而不是将其推入.reduce本身。

const arr = [
... Your Array
];
groupedItems = arr.reduce((acc, curr) => {
const key = curr["createdAt"];
if (!acc[key]) acc[key] = {}
for (let i in curr) {
if (i === "createdAt") {
acc[key][i] = curr[i]
} else {
acc[key][i] = (acc[key][i] || 0) + 1
}
}
return acc;
}, {});
console.log(Object.values(groupedItems))

我会手动执行此操作。

首先,通过提取所有不同的createdAt来分解它(将其提取到一个集合中以避免重复(。然后,对于每个createdAt,获取所有现有的密钥。对于每个关键点,计算出现次数。

这是代码的开始,我将如何做。我希望这已经有所帮助,我现在没有时间完成代码,但请告诉我,你可以用这种方法来做。

代码:

const data = [
{
"Happy": 1,
"createdAt": "2021-12-20"
},
{
"Tired": 1,
"createdAt": "2021-12-14"
},
{
"Energetic": 1,
"createdAt": "2021-12-13",
"Anxious": 1
},
{
"Energetic": 1,
"createdAt": "2021-12-13",
"Anxious": 1
},
{
"Tired": 1,
"createdAt": "2021-12-09",
"Anxious": 1
},
{
"Tired": 1,
"createdAt": "2021-12-09",
"Anxious": 1
},
{
"Sad": 1,
"createdAt": "2021-12-09"
},
{
"Sad": 1,
"createdAt": "2021-12-08"
},
{
"Happy": 1,
"createdAt": "2021-12-08"
},
{
"Anxious": 1,
"createdAt": "2021-12-08"
},
{
"Happy": 1,
"createdAt": "2021-12-08"
},
{
"Tired": 1,
"createdAt": "2021-12-08"
},
{
"Energetic": 1,
"createdAt": "2021-12-08"
},
{
"Anxious": 1,
"createdAt": "2021-12-08"
},
{
"Happy": 1,
"createdAt": "2021-12-08"
},
{
"Sad": 1,
"createdAt": "2021-12-08"
},
{
"Happy": 1,
"createdAt": "2021-12-08"
},
{
"Happy": 1,
"createdAt": "2021-12-08"
},
{
"Anxious": 1,
"createdAt": "2021-12-08"
},
{
"Sad": 1,
"createdAt": "2021-12-08"
},
{
"Anxious": 1,
"createdAt": "2021-12-08"
},
{
"Anxious": 1,
"createdAt": "2021-12-08"
},
{
"Tired": 1,
"createdAt": "2021-12-08"
},
{
"Anxious": 1,
"createdAt": "2021-12-08"
},
{
"Anxious": 1,
"createdAt": "2021-12-08"
}
]
const createdAts = new Set()
data.forEach(datum => {
createdAts.add(datum.createdAt);
});
const dataTranformed = [];
createdAts.forEach(createdAt => {
// This array contains all data entries, for one createdAt-date
const dataFiltered = data.filter((datum) => datum.createdAt === createdAt);

// Here you will have to create a new object and add all the keys & values from dataFiltered (&increment numbers if an key already exists)
// Add this Object to the dataTransformed list and you are done
});

假设您的数组名为data:

// let's create an object with keys equals to all created dates, values are all items with that date.
const grouped = Object.values(data.reduce((res, item) => {
const groupedItem = Object.keys(item).reduce((group, key) => {
if (key === 'createdAt') {
return group;
}
const value = item[key];
if (isNaN(value)) { // if the value is not a number
return group;
}
return {
...group,
[key]: (group[key] || 0) + value,
};
}, res[item.createdAt] || {createdAt: item.createdAt});

return {
...res,
[item.createdAt]: groupedItem,
};
}, {}));
console.log(grouped);

您可以通过析构函数createdAt进行分组,并收集rest对象的每个键/值对的计数。

const
data = [{ Happy: 1, createdAt: "2021-12-20" }, { Tired: 1, createdAt: "2021-12-14" }, { Energetic: 1, createdAt: "2021-12-13", Anxious: 1 }, { Energetic: 1, createdAt: "2021-12-13", Anxious: 1 }, { Tired: 1, createdAt: "2021-12-09", Anxious: 1 }, { Tired: 1, createdAt: "2021-12-09", Anxious: 1 }, { Sad: 1, createdAt: "2021-12-09" }, { Sad: 1, createdAt: "2021-12-08" }, { Happy: 1, createdAt: "2021-12-08" }, { Anxious: 1, createdAt: "2021-12-08" }, { Happy: 1, createdAt: "2021-12-08" }, { Tired: 1, createdAt: "2021-12-08" }, { Energetic: 1, createdAt: "2021-12-08" }, { Anxious: 1, createdAt: "2021-12-08" }, { Happy: 1, createdAt: "2021-12-08" }, { Sad: 1, createdAt: "2021-12-08" }, { Happy: 1, createdAt: "2021-12-08" }, { Happy: 1, createdAt: "2021-12-08" }, { Anxious: 1, createdAt: "2021-12-08" }, { Sad: 1, createdAt: "2021-12-08" }, { Anxious: 1, createdAt: "2021-12-08" }, { Anxious: 1, createdAt: "2021-12-08" }, { Tired: 1, createdAt: "2021-12-08" }, { Anxious: 1, createdAt: "2021-12-08" }, { Anxious: 1, createdAt: "2021-12-08" }],
result = Object.values(data.reduce((r, { createdAt, ...o }) => {
r[createdAt] ??= { createdAt };
Object
.entries(o)
.forEach(([k, v]) => r[createdAt][k] = (r[createdAt][k] || 0) + v);
return r;
}, {}));
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

假设这是下面的数组

let arr = [ ... ]; 

然后我们过滤对象,将日期分组为密钥

const g = arr.reduce((a, c) => {
let date = c.createdAt;
if(!a[date]) {
a[date] = [];
}
a[date].push(c);
return a;
}, {});

使用生成的数组将筛选后的对象作为数组返回。。。

const groupedByDate = Object.keys(g).map(dt => {
return { date:dt, values: g[dt] };
});
console.log(groupedByDate);

最新更新