Вам нужны две разные итерации. Один для заголовка, а другой для тела таблицы. Для заголовка нужно всего лишь добавить название месяца в заказ. Фрагмент с вычисленным свойством months
показывает, как это сделать. Это завершает итерацию заголовка и первый.
Второй этап немного сложнее. Вам нужно заранее знать, сколько будет строк, для этого я создал вычисляемое свойство maxLength
, которое просматривает каждый md
и выдает большую. Затем для каждой строки выполните итерацию по каждому месяцу, а затем проверьте, достаточно ли в месяце дат с помощью v-if
и ищет ли он нужную дату из индекса и структуры вложенных данных. Это возобновляет вторую итерацию.
Приведенный ниже фрагмент является рабочим примером с более сложными данными, показывающими, что может случиться с различными md
размерами и автоматическим c порядком месяца.
var app = new Vue({
el: '#app',
data: () => ({
nested: [
{ "dd": "February",
"md": [{ "dag": "2020-02-01" },{ "dag": "2020-02-02" },{ "dag": "2020-02-03" },{ "dag": "2020-03-04" }]
},
{ "dd": "March",
"md": [{ "dag": "2020-03-01" },{ "dag": "2020-03-02" },{ "dag": "2020-03-03" }]
},
{ "dd": "January",
"md": [{ "dag": "2020-01-01" }]
}
]
}),
computed: {
staticMonths() {
return Array.from(Array(12),(e,i)=>new Date(25e8*++i).toLocaleString('en-US',{month: 'long'}));
},
months() {
return this.nested.map(item => item.dd).sort((a, b) => {
const A = this.staticMonths.indexOf(a);
const B = this.staticMonths.indexOf(b);
return A-B;
});
},
maxLength() {
return this.nested.reduce((accum, curr) => accum > curr.md.length ? accum : curr.md.length, 0);
}
}
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
<div id="app">
<table>
<thead>
<tr>
<th v-for="(item, index) in months">{{ item }}</th>
</tr>
</thead>
<tbody>
<tr v-for="index in maxLength">
<td v-for="item in months">
<span v-if="nested.find(nest => nest.dd === item).md.length > index-1">
{{nested.find(nest=>nest.dd===item).md[index-1].dag}}
</span>
</td>
</tr>
</tbody>
</table>
</div>