【问题标题】:Sorting an object对对象进行排序
【发布时间】:2013-12-05 02:10:30
【问题描述】:

我正在尝试订购一个我从 JSON “转换”的对象。 我正在尝试使用我在 this question 上找到的这个功能,但它似乎不适用于我的情况:

function sortJsonArrayByProperty(objArray, prop, direction){
    if (arguments.length<2) throw new Error("sortJsonArrayByProp requires 2 arguments");
    var direct = arguments.length>2 ? arguments[2] : 1; //Default to ascending

    if (objArray && objArray.constructor===Array){
        var propPath = (prop.constructor===Array) ? prop : prop.split(".");
        objArray.sort(function(a,b){
            for (var p in propPath){
                if (a[propPath[p]] && b[propPath[p]]){
                    a = a[propPath[p]];
                    b = b[propPath[p]];
                }
            }
            // convert numeric strings to integers
            a = a.match(/^\d+$/) ? +a : a;
            b = b.match(/^\d+$/) ? +b : b;
            return ( (a < b) ? -1*direct : ((a > b) ? 1*direct : 0) );
        });
    }
}

这是我的JsFiddle

我想用 3 种不同的方式对其进行排序:

  • 按时间顺序按字典(使用“时间”字段)
  • 按字母顺序按字典(使用“术语”字段“)
  • 全部按时间顺序(忽略字典分隔)

如果这个对象不是那么嵌套,我会知道该怎么做。我可以调整那个功能吗?

【问题讨论】:

  • 不是将整个对象传递给sortJsonArrayByProperty,而是独立传递每个terms数组。仅用于最后一种方式,您必须合并两个数组。
  • 请备份,而不是发布您找到并尝试过的一段代码,描述您实际尝试解决的问题。向我们展示您的数据是什么样的,以及您希望排序后的输出是什么样的。这是我们能够正确帮助您的唯一方法。而且,请在您的实际问题中发布该信息,而不是在 jsFiddle 中。在查看 jsFiddle 中的数据时,由于其中有多个数组,因此不清楚您想要排序的确切内容。
  • 小提琴中有一个obj的副本。
  • @Andy - 完全不清楚他们想要输出的样子。 jsFiddle 中有多个数组。例如,有多个terms 数组。此外,问题应该独立存在,而无需查看 jsFiddle 即可理解问题的含义。
  • 是的,还没有意识到 obj 是如何嵌套的......

标签: javascript sorting


【解决方案1】:

你还没有解释你想要的输出,所以这里是根据你的 jsFiddle 中的数据进行的逻辑猜测。

好的,以下是您的 jsFiddle 中的数据,格式易于理解:

var obj = {saved: [
    {"dict":"English","terms": [
        {"term":"car","rowId":"3487","time":"1384773838069"},
        {"term":"dog","rowId":"443","time":"1384776129957"},
        {"term":"plane","rowId":"16171","time":"1384776168253"},
        {"term":"bread","rowId":"127564","time":"1384959605196"}]
     }, 
     {"dict":"French","terms": [
         {"term":"Monsieur","rowId":"934","time":"1384862250130"},
         {"term":"Croissant","rowId":"13612","time":"1384900161187"},
         {"term":"suis","rowId":"942","time":"1384900437068"}]
      }
    ]
};

我假设您想按其中的一个字段对每个术语数组进行单独排序。

按字段排序的方法如下:

// utility function for sorting an array by a key in alpha order
function sortArrayAlpha(arr, key) {
    arr.sort(function(a, b) {
        return a[key].localeCompare(b[key]);
    });
}

// utility function for sorting an array by a key in parsed numeric order
function sortArrayNum(arr, key) {
    arr.sort(function(a, b) {
        return parseInt(a[key], 10) - parseInt(b[key], 10);
    });
}

// sort by term
var dicts = obj.saved;
// cycle through each item in the saved array
for (var i = 0; i < dicts.length; i++) {
    var terms = dicts[i].terms;
    sortArrayAlpha(terms, "term");
}

// sort by time
// cycle through each item in the saved array
for (var i = 0; i < dicts.length; i++) {
    var terms = dicts[i].terms;
    sortArrayNum(terms, "time");
}

// sort by rowId
// cycle through each item in the saved array
for (var i = 0; i < dicts.length; i++) {
    var terms = dicts[i].terms;
    sortArrayNum(terms, "rowId");
}

还有一个显示输出的 jsFiddle:http://jsfiddle.net/jfriend00/vH8u7/。您可以在 jsFiddle 中查看每种排序的确切输出格式。

这是按术语排序的样子:

{"saved":[
    {"dict":"English","terms":[
        {"term":"bread","rowId":"127564","time":"1384959605196"},
        {"term":"car","rowId":"3487","time":"1384773838069"},
        {"term":"dog","rowId":"443","time":"1384776129957"},
        {"term":"plane","rowId":"16171","time":"1384776168253"}]},
    {"dict":"French","terms":[
        {"term":"Croissant","rowId":"13612","time":"1384900161187"},
        {"term":"Monsieur","rowId":"934","time":"1384862250130"},
        {"term":"suis","rowId":"942","time":"1384900437068"}]
    }
]}

【讨论】:

    猜你喜欢
    • 2017-06-07
    • 2018-02-13
    • 2019-11-24
    • 1970-01-01
    • 1970-01-01
    • 2011-10-04
    • 1970-01-01
    • 2018-08-18
    相关资源
    最近更新 更多