[英]Create a array based on Map
我有一张地图。 检查地图上的连续键值,我需要分离键并插入到新数组中。
let map = new Map<string, string>();
map.set("SUNDAY", "1");
map.set("MONDAY", "2");
map.set("TUESDAY", "2");
map.set("WEDNESDAY", "4");
map.set("THURSDAY", "5");
map.set("FRIDAY", "5");
map.set("SATURDAY", "9");
预期输出应该是这样的:
[{
day: "SUNDAY",
value: "1"
},
{
day: "MONDAY-TUESDAY",
value: "2"
},
{
day: "WEDNESDAY",
value: "4"
},
{
day: "THURSDAY-FRIDAY",
value: "5"
},
{
day: "SATURDAY",
value: "9"
}
];
您可以reduce
Map
的entries
并根据value
它们分组。 如果当前value
已存在于累加器中,则将-
和当前day
附加到对象中。 否则,向累加器添加一个新密钥。 然后使用Object.values()
将累加器的值作为数组返回
const map = new Map([["SUNDAY","1"],["MONDAY","2"],["TUESDAY","2"],["WEDNESDAY","4"],["THURSDAY","5"],["FRIDAY","5"],["SATURDAY","5"]]); const merged = [...map].reduce((acc, [day, value]) => { if(acc[value]) acc[value].day += `-${day}` else acc[value] = { day, value }; return acc }, {}); const output = Object.values(merged); console.log(output)
更新:
如果打字稿不允许传播Map
的数组里面,你可以设置downlevelIteration
到true
的tsconfig(打字稿和Iterator:类型“IterableIterator”不是数组类型)
你也可以使用Map#forEach
来做同样的事情。 此外,如果您希望day
是一系列天数,您可以使用另一个名为“previousValue”的变量。 如果previousValue
是相同的电流值,拆分day
已经存在的-
而采取的第一个值。 然后追加day
let map = new Map([["SUNDAY","1"],["MONDAY","2"],["TUESDAY","2"],["WEDNESDAY","4"],["THURSDAY","5"],["FRIDAY","5"],["SATURDAY","5"]]); let merged = {}, previousValue; map.forEach((value, day) => { if(previousValue === value) merged[value].day = `${merged[value].day.split('-')[0]}-${day}` else merged[value] = { day, value }; previousValue = value; }) const output = Object.values(merged) console.log(output)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.