繁体   English   中英

基于 Map 创建数组

[英]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 Mapentries并根据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的数组里面,你可以设置downlevelIterationtrue的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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM