用javascript对json数据进行排序

sorting json data in javascript

本文关键字:排序 数据 json javascript      更新时间:2023-09-26

下面是我拥有的json数据,其中包含状态数组。数组的大小总是2,但数组中元素的顺序不是固定的。数组元素的值可以为null。样本数据如下所示:

{
   "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. 如何按asc或desc顺序对所有状态进行排序

您可以迭代数据中的所有元素,用带有类似回调的迭代器将任何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/

仅供参考,javascript数组对象有一个排序函数,它实现了一些基本的内置排序功能。如果你需要执行更具体的排序(你这样做了),你可以总是把一个函数传递给排序函数,并实现你自己的自定义逻辑。W3Schools的这篇文章有一些例子,在这里引用了其中一个。。。

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

现在,要将null值"转换"为"-"文字,我想您需要为您的问题添加更多细节,这样我才能提供一个好的解决方案。为什么需要转换它们?这个json是从哪里来的?