在React中循环遍历地图

Hol*_*515 4 javascript typescript reactjs

我有一个Map对象:

let dateJobMap = new Map();

for (let jobInArray of this.state.jobs) {
  let deliveryDate: Date = new Date(jobInArray.DeliveryDate);
  let deliveryDateString: string = deliveryDate.toLocaleDateString("en-US");

  if (dateJobMap.has(deliveryDateString)) {
    let jobsForDate: IDeliveryJob[] = dateJobMap.get(deliveryDateString);
    jobsForDate.push(jobInArray);
  }
  else {
    let jobsForDate: IDeliveryJob[] = [jobInArray];
    dateJobMap.set(deliveryDateString, jobsForDate);
  }
}
Run Code Online (Sandbox Code Playgroud)

在我的render方法中,我想为值数组中的每个传递作业调用TruckJobComp对象以显示它:

        <div className={ styles.column }>
          <p className={ styles.description }>{escape(this.props.description)}</p>

          {
            dateJobMap.forEach(function(jobsForDate, dateString) {
              jobsForDate.map(job => (
                <TruckJobComp job = { job } />
              ))
            })
          }
        </div>
Run Code Online (Sandbox Code Playgroud)

这似乎应该起作用,但不起作用。它从不创建TruckJobComp。我做了.forEach我的迭代Map,并为每个valuearray,我用.map得到个人工作对象发送到TruckJobComp对象。

当我创建一个临时文件array以从上一个循环中获取作业时:

let tempJobs: IDeliveryJob[];
Run Code Online (Sandbox Code Playgroud)

并在循环中添加:

  if (dateJobMap.has(deliveryDateString)) {
    let jobsForDate: IDeliveryJob[] = dateJobMap.get(deliveryDateString);
    jobsForDate.push(jobInArray);

    tempJobs = jobsForDate;
  }
Run Code Online (Sandbox Code Playgroud)

然后array在渲染中使用它:

          <div className={ styles.column }>
            <p className={ styles.description }>{escape(this.props.description)}</p>
            {
              tempJobs.map(job => (
                <TruckJobComp job = { job }/>
              ))
            }
          </div>
Run Code Online (Sandbox Code Playgroud)

它按预期显示。

我在Visual Studio Code中确实有警告:

Warning - tslint - ...\TruckDeliverySchedule.tsx(104,38): error no-function-expression: Use arrow function instead of function expression
Run Code Online (Sandbox Code Playgroud)

我不了解。第104行对应于:

dateJobMap.forEach(function(jobsForDate, dateString) {
Run Code Online (Sandbox Code Playgroud)

我对此很陌生,所以我不确定100%的工作原理。只是想把我学到的东西放在一起,使事情起作用。

第二编辑:

{转义(this.props.description)}

{
  [...dateJobMap.keys()].map(jobsForDate => // line 154
    jobsForDate.map(job => (
      <TruckJobComp job = { job } />
    ))
  )
}
Run Code Online (Sandbox Code Playgroud)

产生错误:

[09:06:56] Error - typescript - src\...\TruckDeliverySchedule.tsx(154,27): error TS2461: Type 'IterableIterator<any>' is not an array type.
Run Code Online (Sandbox Code Playgroud)

Est*_*ask 6

dateJobMap.forEach(...) returns undefined, so it cannot be mapped to a collection of elements.

ES6 maps have forEach method for compatibility purposes (generally for..of is preferred to iterate over iterables) and don't have map method. A map should be converted to array first, then it could be mapped to an element. Since values aren't used, only keys need to be retrieved:

  {
    [...dateJobMap.keys()].map(jobsForDate =>
      jobsForDate.map(job => (
        <TruckJobComp job = { job } />
      ))
    )
  }
Run Code Online (Sandbox Code Playgroud)

  • 我没有注意到问题上的打字稿标签。该问题是 TS 特有的。请参阅 /sf/answers/3262411631/ 和 /sf/answers/3077520421/ 。您应该启用“downlevelIteration”编译器选项或将“[...dateJobMap.keys()]”替换为“Array.from(dateJobMap.keys())”。 (5认同)
  • 正如所提到的,它将映射转换为数组。`dateJobMap.keys()` 是 `Map` 方法,返回[一个可迭代](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Iteration_protocols#The_iterable_protocol),并且 [.. .扩展语法](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_syntax) 与 `[]` 数组文字一起使用时将可迭代对象转换为数组。 (2认同)