【问题标题】:sorting json data in javascript在javascript中对json数据进行排序
【发布时间】:2014-05-22 00:30:29
【问题描述】:

下面是我拥有的包含状态数组的 json 数据。数组的大小始终为 2,但数组元素的顺序不固定。数组元素值可以为空。样本数据如下图:

{
   "status": "SUCCESS",
   "status_message": "Susscessfully queried details.",
   "total_records": 2,
   "m_details":
   [
       {
           "p_id": 1023,
           "pname": "india",
           "states":
           [
               {
                   "state": "karnataka",
                   "capital": "bangalore"
               },
               {
                   "state": null,
                   "capital": null,
               }
           ]
       },
       {
           "p_id": 1023,
           "pname": "india",
           "states":
           [
               {
                   "state": null,
                   "capital": null
               },
               {
                   "state": "Tamilnadu",
                   "capital": "chennai"
               }
           ]
       }
   ]
}

我的问题:

  1. 如何将空值转换为一些默认文本,比如“-”。
  2. 如何按升序或降序对所有状态进行排序。

【问题讨论】:

标签: javascript json


【解决方案1】:

您可以遍历数据中的所有元素,将任何 null 值切换为 "-",使用带有这样回调的迭代器。

function iterateObject(item, callback) {
    if (typeof item === "object" && item !== null) {
        if (item instanceof Array) {
            for (var i = 0; i < item.length; i++) {
                item[i] = iterateObject(item[i], callback);
            }
        } else {
            for (var prop in item) {
                if (item.hasOwnProperty(prop)) {
                    item[prop] = iterateObject(item[prop], callback);
                }
            }
        }
    } else {
         // call the callback on any item that is not an array or object
         return callback(item);
    }
    return item;
}


var data = {
   "status": "SUCCESS",
   "status_message": "Susscessfully queried details.",
   "total_records": 2,
   "m_details":
   [
       {
           "p_id": 1023,
           "pname": "india",
           "states":
           [
               {
                   "state": "karnataka",
                   "capital": "bangalore"
               },
               {
                   "state": null,
                   "capital": null,
               }
           ]
       },
       {
           "p_id": 1023,
           "pname": "india",
           "states":
           [
               {
                   "state": null,
                   "capital": null
               },
               {
                   "state": "Tamilnadu",
                   "capital": "chennai"
               }
           ]
       }
   ]
};

// iterate through the object and convert all `null` values to `"-"`
iterateObject(data, function(item) {
    return (item === null) ? "-" : item;
});

然后您可以像这样对每个状态数组进行排序:

function sortStates(item) {
    var array = item.m_details;
    for (var i = 0; i < array.length; i++) {
        array[i].states.sort(function(a, b) {
            return a.state.localeCompare(b.state);
        });
    }
}

sortStates(data);

如果您想要相反的排序顺序,那么只需在 .sort() 回调中交换参数 ab

工作演示:http://jsfiddle.net/jfriend00/MTQ86/

【讨论】:

    【解决方案2】:

    仅供参考,javascript 数组对象有一个排序函数,它实现了一些基本的内置排序功能。如果您需要执行更具体的排序(您需要),您始终可以将一个函数传递给排序函数并实现您自己的自定义逻辑。 This article from W3Schools 有一些例子在这里引用其中一个......

    var points = [40,100,1,5,25,10];
    points.sort(function(a,b){return b-a}); //sorts numbers in descending order
    

    现在,要将空值“转换”为“-”字面量,我想您需要为您的问题添加更多详细信息,以便我提供一个好的解决方案。为什么需要转换它们?这个json是从哪里来的?

    【讨论】:

    • 我正在使用 AngularJs 循环遍历 m_details 并在两列中显示状态详细信息。只有两列,即卡纳塔克邦和泰米尔纳德邦。即使状态数组在 json 中的排列不一致,我也需要正确地从 json 中提取状态详细信息并填充正确的 td。我从 REST 服务获取这个 json 数据。
    猜你喜欢
    • 2021-12-14
    • 1970-01-01
    • 2016-07-26
    • 2011-05-12
    • 2013-07-15
    • 1970-01-01
    • 1970-01-01
    • 2021-05-01
    • 1970-01-01
    相关资源
    最近更新 更多