Angular 7: цикл через сложный объект и заполнение таблицы

Я пытаюсь передать объект угловому компоненту. Мне нужно перебрать объект и заполнить таблицу. На данный момент я сдал два объекта. Я могу получить длину объекта TrackRecord, поскольку это простой массив. Кажется, я не могу получить длину объекта FundStatistics, поскольку он кажется сложным. Я предполагаю, что в объекте есть данные.

JSON-структура FundStatistics

"{"237146":[{"m_Item1":"ArithmeticMean","m_Item2":0.005521221052631577,"m_Item3":0.01912607076595362},{"m_Item1":"AverageGain","m_Item2":0.038913171935483874,"m_Item3":0.13479918175184283},{"m_Item1":"AverageLoss","m_Item2":-0.03429225884615385,"m_Item3":-0.11879186925568348}]}"

Зацикливание компонента и передача данных

 <div class = "panel panel-default">
        <div class = "panel-heading product-heading">
            <span style = "font-size: 14px; font-weight: bold;">Performance Track Record and Statistics</span>
        </div>
        <div *ngIf  = "ViewModel.FundPerformance" class = "panel-body" style = "width:100%">
            <div *ngFor = "let ftr of ViewModel.FundPerformance">
                <div style = "clear: both;"></div>
                <br /><br />
                <fund-statistics [fundStatistics] = "ftr.FundStatistics"  [fundTrackRecord]= "ftr.TrackRecord"></fund-statistics>
            </div>

        </div>
    </div>

Код компонента

export class FundStatisticsComponent implements OnInit {
    @Input() fundStatistics: any;
    @Input() fundTrackRecord: any;

    ngOnInit() {
    }
}

Ниже приведена таблица, которую я хочу заполнить. Я в основном хочу заполнить, например, m_Item2 ArithmeticMean массива в первом столбце под средним арифметическим в таблице и m_Item3 ArithmeticMean в массиве под вторым столбцом среднего арифметического в таблице

<div *ngFor = "let fundStats of fundStatistics">

    <table class = "statsTable">
                <tr>
                    <td></td>
                    <td colspan = "2" class = "tableItem header">Fund Name</td>

                    <td colspan = "2" class = "headerTableItem header">Benchmark</td>
                    <td></td>
                    <td></td>
                </tr>
                <tr>
                    <td></td>
                    <td class = "tableItem bold">Monthly </td>
                    <td class = "tableItem bold">Annualized</td>
                    <td class = "tableItem bold">Monthly </td>
                    <td class = "tableItem bold">Annualized</td>
                </tr>
                <tr class = "rowItem">
                    <td class = "titleTableItem header">Compound ROR</td>
                    <td class = "tableItem"></td>
                    <td class = "tableItem"></td>
                    <td class = "tableItem"></td>
                    <td class = "tableItem"></td>
                </tr>
                <tr class = "rowItem">
                    <td class = "titleTableItem  header">Arithmetic Mean </td>
                    <td class = "tableItem"></td>
                    <td class = "tableItem"></td>
                    <td class = "tableItem"></td>
                    <td class = "tableItem"></td>
                </tr>
                <tr class = "rowItem">
                    <td class = "titleTableItem  header">Standard Deviation</td>
                    <td class = "tableItem"></td>
                    <td class = "tableItem"></td>
                    <td class = "tableItem"></td>
                    <td class = "tableItem"></td>
                </tr>

    </table>            
  </div>   
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
0
0
383
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

*ngFor не поддерживает итерации по объектам или картам. Вы можете использовать Object.keys(fundStatistics) для получения ключей, а затем использовать их в качестве значений для *ngFor

export class FundStatisticsComponent implements OnInit {
    @Input() fundStatistics: any;
    @Input() fundTrackRecord: any;
    fundStatisticksKeys = [];

    ngOnInit() {
        this.fundStatisticksKeys = Object.keys(this.fundStatistics);
    }
}

И затем в вашем шаблоне сделайте что-то вроде

<div *ngFor = "let key of fundStatisticksKeys">

и получить текущий элемент как fundStatistics[key]

Начиная с Angular 6.1, также есть новый Pipe под названием KeyValuePipehttps://angular.io/api/common/KeyValuePipe#description, который можно использовать именно для таких случаев.

В этом случае вам не нужно заранее получать ключи объекта, просто используйте вертикальную черту в своем шаблоне, и вы получите fundStats.key и fundStats.value в своем шаблоне, например fundStats.value.m_Item1

<div *ngFor = "let fundStats of fundStatistics | keyvalue">

Редактировать Затем, чтобы заполнить таблицу, вы можете использовать такую ​​интерполяцию, если я правильно понимаю, что вам нужно. value будет содержать значение записи, которую вы зацикливаете

<tr class = "rowItem">
    <td class = "titleTableItem  header">Arithmetic Mean </td>
    <td class = "tableItem">{{ fundStats.value.m_Item2 }}</td>
    <td class = "tableItem">{{ fundStats.value.m_Item3 }}</td>
    <td class = "tableItem"></td>
    <td class = "tableItem"></td>
</tr>

Если у вас нет фиксированного числа значений m_Item*, вы также можете использовать ngFor для зацикливания на них.

И как вы предлагаете мне присвоить значения столбцам в таблице, как я упоминал в сообщении

Tom 08.04.2019 22:57

Не в моем случае ключ и несколько значений

Tom 08.04.2019 23:09

@ Том, я обновил ответ. Насколько я помню, .value будет содержать значение записи, которую вы зацикливаете.

davideSerafini 08.04.2019 23:18

вы также можете создавать геттеры для этих ключей, например get keysOfMyObj(), а не определять их внутри ngOninit или конструктора.

O-9 23.07.2021 13:57

Другие вопросы по теме