Думайте о карте как о специализированном цикле foreach
, который возвращает массив, значения которого являются возвращаемым значением функции, примененной к каждому элементу вашего исходного массива.
Например, если у вас был такой массив:
arr = [1, 2, 3, 4]
Вы можете получить массив со всеми значениями, удвоенными, используя карту следующим образом:
arr.map(e => e * 2) // => [2, 4, 6, 8]
Аналогично, если у вас есть массив объектов, вы можете отобразить его так, чтобы он создавал строки, которые представляют элементы HTML <tr>
с такой же легкостью:
const data = [
{
week: 'Monday',
title: 'title 1',
price: 12,
},
{
week: 'Monday',
title: 'title 2',
price: 34,
},
// ...
]
data.map(obj => `<tr>
<td>Weekday: ${obj.week}</td>
<td>Title: ${obj.title}</td>
<td>Price: $${obj.price.toFixed(2)}</td>
</tr>`)
Это даст вам следующее:
[ '<tr>\n <td>Weekday: Monday</td>\n <td>Title: title 1</td>\n <td>Price: $12.00</td>\n</tr>',
'<tr>\n <td>Weekday: Monday</td>\n <td>Title: title 2</td>\n <td>Price: $34.00</td>\n</tr>' ]
Затем вы можете применить join
к этому, и вы готовы идти.
НО, есть лучший подход к этому: использовать reduce
вместо map
. В то время как map
создает новый массив, reduce
создает единственное значение, накапливая элементы вашего исходного массива, следуя определенному вами правилу.
Например, если я хотел получить сумму всех элементов в массиве:
let accumulator = (result, value) => result + value;
let startValue = 0;
[1, 2, 3, 4].reduce(accumulator, startValue) // => 10
Для вашего случая вы можете уменьшить data
в строку:
const data = [
{
week: 'Monday',
title: 'title 1',
price: 12,
},
{
week: 'Monday',
title: 'title 2',
price: 34,
},
// ...
]
const table = data.reduce((tbody, obj) => tbody + `<tr>
<td>Weekday: ${obj.week}</td>
<td>Title: ${obj.title}</td>
<td>Price: $${obj.price.toFixed(2)}</td>
</tr>`, "<table>") + "</table>";