У меня есть объект 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.
dateJobMap.forEach(...)
возвращает undefined
, поэтому его нельзя сопоставить с набором элементов.
ES6 карты имеют forEach
метод для целей совместимости (обычно for..of
является предпочтительным перебрать итерируемые) и не имеет map
метода. Сначала карта должна быть преобразована в массив, затем она может быть сопоставлена с элементом. Поскольку значения не используются, необходимо получить только ключи:
{
[...dateJobMap.keys()].map(jobsForDate =>
jobsForDate.map(job => (
<TruckJobComp job = { job } />
))
)
}
Все это предупреждение говорит о том, что вместо использования синтаксической function(jobsForDate, dateString) {}
вы должны использовать синтаксис (jobsForDate, dateString) => {}
.
Причина может заключаться в том, как this
связано с функциями стрелок и выражений функции. См. Этот пост.
Я предполагаю, что ваш первый подход не сработал, но ваш второй сделал, что forEach
фактически не возвращает массив, и если бы это произошло, вызов map
внутри forEach
вернул массив массивов (но, опять же, это не делает). Не уверен, как React справится с этим, но React знает, как обращаться с одним массивом, и это то, что возвращает ваш последний подход.
.forEach
не возвращает массив в себя, но она должна вернуть Map
«s value
, которое является массивом. Я подтвердил это вне метода рендеринга с помощью console.loging.
...
? И почему...dateJobMap.keys()
заключен в квадратные скобки? И я не обязан использовать.forEach
, это был только первый, который я нашел.dateJobMap.keys()
- это методMap
который возвращает итерируемое , и ... синтаксис распространения преобразует итерируемое в массив при использовании с[]
array literal.s