【问题标题】:How to sort a table with imported JSON data如何使用导入的 JSON 数据对表进行排序
【发布时间】:2018-10-03 13:40:36
【问题描述】:

我有一个包含员工列表的 JSON 文件。我将此数据导入表。下一步是按<th> 添加排序。我的脚本不起作用,没有任何反应。我不知道原因。我只是一个JS初学者。你能帮我解释一下为什么排序不起作用吗?

这是我的存储库: https://github.com/rrajca/Employee-table

我的js是:

$(document).ready(function() {
    $.getJSON("dane.json", function(data) {
        /* var sortedList = data.sort(function(a, b) {
            return a.id - b.id;
          }) */
        var employeeList = "";
        $.each(data, function(key, value) {
            employeeList += "<tr>";
            employeeList += "<td>"+value.id+"</td>";
            employeeList += "<td>"+value.firstName+"</td>";
            employeeList += "<td>"+value.lastName+"</td>";
            employeeList += "<td>"+value.dateOfBirth+"</td>";
            employeeList += "<td>"+value.company+"</td>";
            employeeList += "<td>"+value.note+"</td>";
            employeeList += "</tr>";
        })
        $("tbody").append(employeeList);
    })

    var compare = {
        name: function(a, b) {
            a = a.replace(/^the /i, '');
            b = b.replace(/^the /i, '');

            if (a < b) {
                return -1;
            } else {
                return a > b ? 1 : 0;
            }
        },
        duration: function(a, b) {
            a = a.split(':');
            b = b.split(':');

            a = Number(a[0]) * 60 + Number(a[1]);
            b = Number(b[0]) * 60 + Number(b[1]);

            return a - b;
        },
        date: function(a, b) {
            a = new Date(a);
            b = new Date(b);

            return a - b;
        }
    };

    $('.sortable').each(function() {
        var $table = $(this);
        var $tbody = $table.find('tbody');
        var $controls = $table.find('th');
        var rows = $tbody.find('tr').toArray();

        $controls.on('click', function() {
            var $header = $(this);
            var order = $header.data('sort');
            var column;

            if ($header.is('.ascending') || $header.is('.descending')) {  
                $header.toggleClass('ascending descending');
                $tbody.append(rows.reverse());
            } else {
                $header.addClass('ascending');
                $header.siblings().removeClass('ascending descending'); 
                if (compare.hasOwnProperty(order)) {
                    column = $controls.index(this);

                    rows.sort(function(a, b) {
                        a = $(a).find('td').eq(column).text();
                        b = $(b).find('td').eq(column).text();
                        return compare[order](a, b);
                        });

                $tbody.append(rows);
                }
            }
        });
    });
});

【问题讨论】:

    标签: arrays json sorting html-table getjson


    【解决方案1】:

    将比较函数更改为:

    name: function(a, b) {                  // Add a method called name
          a = a.replace(/^the /i, '');          // Remove The from start of parameter
          b = b.replace(/^the /i, '');          // Remove The from start of parameter
          if(parseInt(a) == +a) {
            a = +a;
            b = +b;            
          }     
          return a > b          
        }
    

    问题是您对所有内容都进行了字符串比较。所以我添加了一个检查,看看它是否是一个数字,并适当地投射。

    https://jsfiddle.net/gj2vonsL/7/

    您编写的其他比较函数还有其他问题,例如无效的日期格式等。但是您的总体想法是正确的

    【讨论】:

    • 感谢您的回答。我注意到当我使用:$.getJSON("dane.json", function(data) { 排序仍然无法正常工作。但是当我复制 json 文件 dane.json 并将其传递给像你一样的 js 时:
       data = [{ 		"id": 1, 		"firstName": "Jan", 		"lastName": "Kowalski", 		"dateOfBirth": "1.7.1990 11:35", 		"company": "XSolve", 		"note": 90 	}, ... 排序正在工作!我不知道为什么会这样。为什么我不能只通过 getJson 导入 json 文件并对这些数据进行排序?
    • 抱歉,我以为您只是在修复错误的排序。 (抱歉,我无法使用 getJSON 更新 jsfiddle。但是,您的问题的症结在于 javascript 的异步性质。在您的代码中,var rows = $tbody.find('tr').toArray() 在 $.getJSON 返回之前被执行。所以您的 rows 数组是空白的当您执行单击事件时(它从外部范围获取并且仅执行一次)。解决此问题的最简单方法是将该行放入单击处理程序中。一旦您这样做,您可以修复您的排序功能
    猜你喜欢
    • 1970-01-01
    • 2017-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多