【问题标题】:How to create a Javascript/Typescript Map dynamically without for loop?如何在没有 for 循环的情况下动态创建 Javascript/Typescript 地图?
【发布时间】:2020-09-25 15:14:03
【问题描述】:

我想动态创建一个 Typescript Map<string, Person> 对象,其中 Person 是一个类。

我可以使用for 循环来创建这样的地图:

function getInitializedPersonMap(size){
  const personMap = new Map<string, Person>();
  for (let index = 0; index < size; index++) {
    personMap.set(index.toString(), {} as Person);
  }
  return personMap;
}

但是,我正在努力养成摆脱“for”循环并使用 map、filter、reduce 等功能的习惯。

我没有循环的尝试看起来像这样,它的可读性不如for循环:

function getInitializedPersonMap(size){
   return new Map<string, Person>(
      Array.from(new Array(size), (_, index) => [
        index.toString(),
        {} as Person,
      ])
    );
}

对于这样的场景,避免“for”循环是不是有点过头了?

【问题讨论】:

  • 我已经编辑了我的答案

标签: javascript typescript dictionary functional-programming


【解决方案1】:

如果你从一开始就知道这些值,那么就很简单了:

  const personMap = new Map<string, Person>([
    ['value1', new Person()],
    ['value2', new Person()],
    ['value3', new Person()]
  ]);

如果您想要基于一些现有的生成数组创建地图,那么您可以:

const arrayLength = 5;
const inputArray = Array.from({ length: arrayLength }, (_, index) => [index + '', new Person()]);

const theMap = new Map<string, Person>(
  inputArray.map(x => [x[0], x[1]] as [string, Person])
);

【讨论】:

  • OP 的代码显示大小可以是任何东西,应该是动态的。
  • 感谢@JoseGuzman,看起来与您的解决方案一样,我们最终使用了 Array.from 重载,该重载采用映射函数以及 Map 构造函数中对 map 的另一个调用。
【解决方案2】:

您可以使用Map,注意类型已明确提及。

var result = sizeArr.map((i): [string, Person] => [i, {} as Person]);

正如@VLAZ 提到的大小是一个数字,所以使用Array.from 将数组从目标大小变平。

let sizeArr = Array.from(Array(n).keys());

【讨论】:

  • size 似乎是一个数字,而不是一个数组。
  • 在第一个示例中,OP 提供了一个基于循环的工作代码。似乎从那里 size 是一个数组。 OP需要澄清更多。
  • @NavoneelTalukdar 只是为了理解您的建议是使用 map over Array.from() 重载,该重载采用映射函数使其更具可读性。是的,这要好得多。但是我试图找到一种不包括创建额外的数组来循环的方式。现在要获得所需的地图,我仍然必须将结果传递给 Map 构造函数。 var result = sizeArr.map((i): [string, Person] => [i, {} as Person]); const resultToBeReturned = new Map(result);
猜你喜欢
  • 2019-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-12
  • 2019-03-11
  • 2020-10-25
  • 1970-01-01
  • 2014-05-26
相关资源
最近更新 更多