Итерация / печать объекта массивов в HTML с сохранением порядка в Angular 7

#javascript #html #arrays #angular #object

#javascript #HTML #массивы #angular #объект

Вопрос:

У меня есть этот объект массивов с данными о встречах:

введите описание изображения здесь

Таким образом, по сути, это набор дат (ключей) с массивом объектов. Каждый элемент в массиве является объектом данных о встречах, таких как день, тема, клиент и продолжительность. Итак, 2 декабря имеет две встречи, а 9 декабря — три и т.д.

Я хочу отобразить, чтобы выполнить итерацию по нему и отобразить его в этом табличном формате:

введите описание изображения здесь

но пытаюсь отобразить его, используя следующий HTML:

 <div *ngFor="let detail of details"   class="card-body">
<table class="table table-striped">
  <thead>
  <tr>
  <th>  Day </th>
  <th>Duration</th>
  <th> Subject</th>
  <th>Client</th>
  </tr>
  </thead>
  <tfoot>
  <tr *ngFor="let detaill of detail">
  <td> <small>{{detaill.day}}</small></td>
  <td> <small>{{detaill.duration}} </small> </td>
  <td><small>{{detaill.subject}}</small> </td>
    <td><small>{{detaill.client}} </small></td>
  </tfoot>
 

это дает мне эту ошибку:

Error: Cannot find a differ supporting object '[object Object]' of type 'object'. NgFor only supports binding to Iterables such as Arrays.

я попытался преобразовать их в массивы, Object.entries(appointments) но при этом испортил порядок дат.

Что я могу сделать, чтобы отобразить таблицу по своему усмотрению?

Комментарии:

1. Вам нужно сформулировать массив, используя ваш исходный объект данных. Затем вы можете выполнить цикл * ngFor со стороны html

Ответ №1:

Форматирование вашего объекта данных в новый массив объектов может быть полезным для вас, чтобы выполнить цикл * ngFor и выполнить свою задачу, я думаю. Этот сегмент кода может быть полезен для форматирования исходного объекта данных.

 // Let's assume your original data object is as follows
const obj = {
    '02/11/2020': [
        {
            duration: 4,
            subject: 'Meeting',
            client: 'Bob'
        },
        {
            duration: 6,
            subject: 'Review',
            client: 'Anna'
        }
    ],
    '03/11/2020': [
        {
            duration: 5,
            subject: 'Review',
            client: 'Rob'
        }
    ]
};

// Find keys and values (as two separated arrays)
const keys = Object.keys(obj);
const values = Object.values(obj);

// Now formulate the new array
const formattedObj = [];
keys.forEach((key, index) => {
    formattedObj.push({
        day: key,
        records: values[index].map(value => ({
            day: key,
            ...value
        }))
    });
});

// Let's test it
console.log(formattedObj); 

Комментарии:

1. спасибо, но это больше не группируется по дням?

2. Можете ли вы попробовать это сейчас!

3. это работает, но как я могу упорядочить его по «дню»?

4. Вы нашли решение? Или мне обновить свой код? Вы можете просто отсортировать массив ключей, который я упоминал выше, перед этим keys.forEach.

5. да, я пометил ваш как решение. Спасибо

Ответ №2:

На самом деле вам не нужно переформатировать ваши данные. просто измените свой шаблон на :-

 <div *ngFor="let detail of details|keyvalue"   class="card-body">
<table class="table table-striped">
  <thead>
  <tr>
  <th>  Day </th>
  <th>Duration</th>
  <th> Subject</th>
  <th>Client</th>
  </tr>
  </thead>
  <tfoot>
  <tr *ngFor="let detaill of detail.value">
  <td> <small>{{detaill.day}}</small></td>
  <td> <small>{{detaill.duration}} </small> </td>
  <td><small>{{detaill.subject}}</small> </td>
    <td><small>{{detaill.client}} </small></td>
  </tfoot>
 

Комментарии:

1. нужно ли мне импортировать или устанавливать что-либо раньше? потому что он все еще выдает ту же ошибку

2. вы использовали канал keyvalue, как я, и detail.value во внутреннем цикле?

3. пожалуйста, stackblitz?