javascript - 改进嵌套的 forEach
问题描述
我有这个嵌套数组:
const users = [
['User_1', [[1596232800000, 4]]],
[
'User_2',
[
[1591567200000, 3],
[1591653600000, 16],
],
],
]
并且想要这个输出:
const dataByDate = [
{
user: 'User_2',
date: 1591567200000,
count: 3,
},
{
user: 'User_2',
date: 1591653600000,
count: 16,
},
{
user: 'User_1',
date: 1596232800000,
count: 4,
},
]
为了实现这一点,我正在这样做:
const dataByDate: { date: string; count: number; user: string }[] = []
users.forEach((user: string[]) => {
if (user[1].length) {
user[1].forEach((item: any) => {
dataByDate.push({ date: item[0], user: user[0], count: item[1] })
})
}
})
我的解决方案运行良好,但我想知道是否有比嵌套 forEach 更清洁、更优雅的解决方案。谢谢!
解决方案
您可以使用.flatMap
内部.map()
. 内部.map()
将获取内部数组的第二个元素(即:[[date, count], ...]
数组),并将它们映射到对象。由于.map()
将生成对象数组,因此您可以使用.flatMap()
将生成的对象合并到一个最终生成的数组中。
请参见下面的示例:
const users = [
['User_1', [[1596232800000, 4]]],
[
'User_2',
[
[1591567200000, 3],
[1591653600000, 16],
],
],
];
const result = users.flatMap(([user, arr]) => arr.map(([date, count]) => ({
user, date, count
})));
console.log(result);
然后,您可以将该.sort()
方法应用于输出数组的任何其他重新排序。
推荐阅读
- jenkins - Jenkins无法将带有fileExists的文件复制到多个目录
- oracle - Python 和 Oracle 中的 Base 64 解码
- angular - 在 ionic 4 中集成谷歌地图时出错
- java - 如何访问另一个应用程序的权限屏幕?
- r - How do I plot a predicted vs actual graph for my Logit Model
- reactjs - React PropTypes 检查错误的类型
- gitlab - How to update gitlab badges during CI without using personal access token
- python - Error 401 when trying to register a new user. Works fine on localhost (Django rest api)
- python-3.x - Drag-and-drop youtube videos into Python/Gtk window
- java - Is it possible to run an ionic cordova build using Java 11 instead of Java 8?