【问题标题】:Create a array based on Map基于 Map 创建数组
【发布时间】:2019-09-04 15:10:10
【问题描述】:

我有一张地图。检查地图上的连续键值,我需要分离键并插入新数组。

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"
    }
  ];

【问题讨论】:

  • 这个问题没有明确说明,因为不清楚你想如何组合天数。无论聚合键是一个范围(例如,“Monday-Wednesday”)还是只是一个连接数组(例如,“Monday-Tuesday-Wednesday”),该示例都保持开放状态。
  • @IngoBürk 聚合键是一个范围(例如,“Monday-Wednesday”)

标签: javascript typescript


【解决方案1】:

您可以reduce entriesMap 并根据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)

更新:

如果 typescript 不允许您在数组内传播 Map,您可以在 tsconfig (TypeScript and Iterator: Type 'IterableIterator' is not an array type) 中将 downlevelIteration 设置为 true

您也可以使用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)

【讨论】:

  • 你错过了 MONDAY-TUESDAYTHURSDAY-FRIDAY 的组合天数
  • 我的角度代码给出的错误如下:Type 'Map' is not an array type or a string type.
  • @Suman 到底是哪一行?如果是[...map] 行,请尝试使用 [...map.entries()]`
  • 是的。我已经尝试过使用条目。它给出的错误如下:Type 'IterableIterator' is not an array type or a string type.
  • @Suman 您可能需要调整 tsconfig 才能使用此 TypeScript and Iterator: Type 'IterableIterator<T>' is not an array type(我将添加一个不涉及传播 Map 的答案)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-21
  • 2016-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多