javascript - 从嵌套的 json 中排序的 Angular 4 数据表

标签 javascript json angular datatable nested

需要有关带有嵌套数据的 Angular 数据表的帮助。

我想对表中的数据进行排序。

我正在使用来自 - https://www.npmjs.com/package/angular2-datatable 的数据表

数据表适用于单一数组类型的数据。 (用于许多 Angular 应用)

问题:我有嵌套的 json(实际上,我有复杂的 json,让这里变得简单)

感谢您对此进行调查。

如有任何建议或帮助,我们将不胜感激。

JSON

records = [
  [
    {
      "name": "Subject Name",
      "type": "text",
      "id": "subjectName",
      "value": "DavidJ",
      "firstName": "David",
      "lastName": "John"
    },
    {
      "name": "QC Name",
      "type": "hidden",
      "id": "qcName",
      "value": "JosephT",
      "firstName": "Joseph",
      "lastName": "Tom"
    }
  ],
  [
    {
      "name": "Subject Name",
      "type": "text",
      "id": "subjectName",
      "value": "TigerC",
      "firstName": "Tiger",
      "lastName": "Chan"
    },
    {
      "name": "QC Name",
      "type": "hidden",
      "id": "qcName",
      "value": "ThomasR",
      "firstName": "Thomas",
      "lastName": "Richard"
    }
  ]
]

HTML

<table class="table table-responsive table-hover" [mfData]="this.records | dataFilter : filterQuery" #mf="mfDataTable" [mfRowsOnPage]="rowsOnPage" [(mfSortBy)]="sortBy" [(mfSortOrder)]="sortOrder">
<thead>
   <tr>
      <th>#</th>
      <th>
         <mfDefaultSorter by="subjectName">subject Name</mfDefaultSorter>
      </th>
      <th>
         <mfDefaultSorter by="qcPerson">QC Person</mfDefaultSorter>
      </th>
   </tr>
</thead>
<tbody *ngIf="!isLoading">
   <tr class="border" *ngFor="let sample of mf.data; let i='index'">
      <td>{{i + 1}}</td>
      <ng-container *ngFor="let item of sample">
         <td *ngIf="item.id ==='subjectName'">
            {{item.firstName}} {{item.lastName}}
         </td>
         <td *ngIf="item.id ==='qcPerson'">
            {{item.firstName}} {{item.lastName}}
         </td>
      </ng-container>
   </tr>
</tbody>
</table>

类型脚本文件

import { Component, OnInit } from '@angular/core';
import { OrderBy } from '../all_services/OrderByPipe';

@Component({
    selector: 'app-userdashboard',
    templateUrl: './userdashboard.component.html',
    styleUrls: ['../header-footer/css/external.style.css']
})

export class UserdashboardComponent implements OnInit {

    constructor() {}

    ngOnInit() {}


    /** Sorting functions */
    public data;
    public filterQuery = "";
    public rowsOnPage = 10;
    public sortBy = "subjectName";
    public sortOrder = "asc";

    public toInt(num: string) {
        return +num;
    }
}

Datafilterpipe.ts

import * as _ from "lodash";
import {Pipe, PipeTransform} from "@angular/core";

@Pipe({
    name: "dataFilter"
})
export class DataFilterPipe implements PipeTransform {

    transform(array: any[], query: string): any {
        if (query) {
            return _.filter(array, row=>row.name.indexOf(query) > -1);
        }
        return array;
    }
}

最佳答案

我遇到过同样的问题。我用过w3school在 DOM 中呈现表格后的表格排序逻辑。

它与 angular2-datatable 一起工作非常顺利,因为我在我的项目中使用相同的数据表。它的用法非常直接,如果您遇到任何问题,请告诉我。

提前致谢。

下面是实现 TS 文件中的函数。

  columnSorter(n) {
    let table, rows, switching, i, x, y, shouldSwitch, dir, switchCount = 0;
    switching = true;
    this.clickSort = !this.clickSort
    dir = "asc";
    table = document.querySelector('.smallTable');
    while (switching) {
      switching = false;
      rows = table.rows;
      for (i = 0; i < (rows.length - 1); i++) {
        shouldSwitch = false;
        x = rows[i].getElementsByTagName("TD")[n];
        y = rows[i + 1].getElementsByTagName("TD")[n];
        if (dir == 'asc') {
          if (x.innerHTML.toLowerCase() > y.innerHTML.toLowerCase()) {
            shouldSwitch = true;
            break;
          }
        } else if (dir == 'desc') {
          if (x.innerHTML.toLowerCase() < y.innerHTML.toLowerCase()) {
            shouldSwitch = true;
            break;
          }
        }
      }
      if (shouldSwitch) {
        rows[i].parentNode.insertBefore(rows[i + 1], rows[i]);
        switching = true;
        switchCount++;
      } else {
        if (switchCount == 0 && dir == 'asc') {
          dir = 'desc';
          switching = true;
        }
      }
    }
  }

在您的 HTML 表格中,只需在下面添加,其中 0 是列号。

(click)="columnSorter(0)

关于javascript - 从嵌套的 json 中排序的 Angular 4 数据表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51822924/

相关文章:

javascript - Angular polymer 数据绑定(bind)

javascript - 在 JavaScript 中设置 CSS 属性?

javascript - 将每个点 (.) 和字符串开头的单词大写

c# - 将 JSON 数组反序列化为字符串数组

forms - Angular 2 : Too many components in a module?

javascript - 如何检查给定的值是正整数还是负整数?

c# - 如何使用 Newtonsoft.Json 序列化 "Really"循环引用对象?

JSON 和 Cygwin - 如何解析、获取字段等

javascript - 极速: FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory

angular - 如何测试返回多个操作的效果