Цикл по карте в React

2

У меня есть объект 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);
  }
}

В моем методе 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>

Кажется, что это должно работать, но нет. Он никогда не создает TruckJobComp. Я .forEach итерацию .forEach на моей Map, и для каждого array value я использую .map чтобы получить отдельный объект задания для отправки объекту TruckJobComp.

Когда я создаю array temp для захвата заданий из последнего цикла:

let tempJobs: IDeliveryJob[];

и в цикле добавить:

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

    tempJobs = jobsForDate;
  }

а затем использовать этот array в рендере:

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

Он отображается так, как ожидалось.

У меня есть предупреждения в коде Visual Studio:

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

Я не знаю достаточно, чтобы понять. Строка 104 соответствует:

dateJobMap.forEach(function(jobsForDate, dateString) {

Я очень новичок в этом, поэтому я не уверен на 100%, как это работает. Просто пытаясь разложить кусочки, которые я изучил, чтобы заставить работать.

Второе редактирование:

{Побег (this.props.description)}

{
  [...dateJobMap.keys()].map(jobsForDate => // line 154
    jobsForDate.map(job => (
      <TruckJobComp job = { job } />
    ))
  )
}

Производит ошибку:

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

2 ответа

2
Лучший ответ

dateJobMap.forEach(...) возвращает undefined, поэтому его нельзя сопоставить с набором элементов.

ES6 карты имеют forEach метод для целей совместимости (обычно for..of является предпочтительным перебрать итерируемые) и не имеет map метода. Сначала карта должна быть преобразована в массив, затем она может быть сопоставлена с элементом. Поскольку значения не используются, необходимо получить только ключи:

  {
    [...dateJobMap.keys()].map(jobsForDate =>
      jobsForDate.map(job => (
        <TruckJobComp job = { job } />
      ))
    )
  }
  • 0
    Я довольно новичок в разработке машинописи / JavaScript (я работал с iOS 7 лет) и извиняюсь, я не совсем понимаю пример кода, который вы предоставили. Каковы ... ? И почему ...dateJobMap.keys() заключен в квадратные скобки? И я не обязан использовать .forEach , это был только первый, который я нашел.
  • 0
    Как уже упоминалось, он преобразует карту в массив. dateJobMap.keys() - это метод Map который возвращает итерируемое , и ... синтаксис распространения преобразует итерируемое в массив при использовании с [] array literal.s
Показать ещё 4 комментария
2

Все это предупреждение говорит о том, что вместо использования синтаксической function(jobsForDate, dateString) {} вы должны использовать синтаксис (jobsForDate, dateString) => {}.

Причина может заключаться в том, как this связано с функциями стрелок и выражений функции. См. Этот пост.

Я предполагаю, что ваш первый подход не сработал, но ваш второй сделал, что forEach фактически не возвращает массив, и если бы это произошло, вызов map внутри forEach вернул массив массивов (но, опять же, это не делает). Не уверен, как React справится с этим, но React знает, как обращаться с одним массивом, и это то, что возвращает ваш последний подход.

  • 0
    Это действительно очистило предупреждение, спасибо.
  • 0
    .forEach не возвращает массив в себя, но она должна вернуть Map «s value , которое является массивом. Я подтвердил это вне метода рендеринга с помощью console.loging.
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню