问题描述
我有这个嵌套数组:
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()
方法应用于输出数组的任何其他重新排序。
使用Array.prototype.flatMap()
和Array.prototype.reduce()
的组合。 reduce为用户循环遍历每个数据集,并为该集中的每个条目创建和对象。然后将该对象合并到累加数组中。
现在flatMap
将为每个用户返回一个包含对象的新数组。对象的数量取决于[date,count]
条目的数量,并且将位于嵌套数组中。 flatMap
的平坦部分通过将每个对象放在单个数组中来解决此问题。
const users = [
[
'User_1',[
[1596232800000,4]
]
],[
'User_2',[
[1591567200000,];
const formatUserData = users => users.flatMap(([ user,data ]) =>
data.reduce((arr,[ date,count ]) =>
[...arr,{ user,count }],[])
);
const result = formatUserData(users);
console.log(result);
,
使用映射和数组解构,可以实现以下目标:
const result = users
.map(([ user,items ]) => {
return items.flatMap(([date,count]) => ({ user,count }))
})
.flatMap(i => i)
.sort((a,b) => a.date - b.date);
const users = [
['User_1',[
'User_2',[
[1591567200000,]
const result = users.map(([ user,items ]) => {
return items.flatMap(([date,count }))
}).flatMap(i => i).sort((a,b) => a.date - b.date);
console.log({result})