如何在不展开对象的情况下添加props?Map转数组问题求助
问题:将Map结构转换为指定格式的数组
需要转换的Map结构:
Map { 0: { hangWithFriends: 100 }, 1: { Chill: 30, Book: 80 }, 2: { Yoga: 40 }, 3: { Birthday: 200 }, 4: { Gas: 70 }, 5: { Rent: 900, testingsub: 200 }, 6: { testSub: 500 } }
目标数组格式:
[ {date: 0, hangWithFriends: 100}, {date:1, Chill: 30, Book:80}, {date: 2, Yoga:40}, {date: 3, Birthday:200}, {date:4, Gas:70}, {date:5, Rent:900, testingsub:200}, {date: 6, testSub: 500} ]
尝试的代码:
reducedMonths.forEach((date, obj) => { newData.push({ date, ...obj }); });
得到的错误结果:
Array(7) [ { date: { hangWithFriends: 100 } }, { date: { Chill: 30, Book: 80 } }, { date: { Yoga: 40 } }, { date: { Birthday: 200 } }, { date: { Gas: 70 } }, { date: { Rent: 900, testingsub: 200 } }, { date: { testSub: 500 } } ]
解答
你搞反了Map的forEach方法参数顺序。Map的forEach回调第一个参数是值(value),第二个才是键(key),你把顺序写反了,导致把Map里的对象值当成了date字段的内容,而真正的日期key没被用到。
修正后的代码:
const newData = []; reducedMonths.forEach((obj, date) => { newData.push({ date: Number(date), ...obj }); });
也可以用更简洁的Array.from写法直接转换:
const newData = Array.from(reducedMonths, ([date, obj]) => ({ date: Number(date), ...obj }));
说明:
- 调整
forEach的参数顺序后,obj对应Map里的属性对象,date对应Map的键(也就是0-6这些数字)。 - 因为Map的键会被存储为字符串类型,所以用
Number(date)把它转成数字,和目标格式中的date字段类型一致。 - 展开运算符
...obj会自动把obj里的所有键值对合并到新对象中,不管属性数量多少都能处理。
内容的提问来源于stack exchange,提问作者Mathew
相关产品推荐
相关产品推荐

