【问题标题】:Javascript Sort key value pair object based on valueJavascript根据值对键值对对象进行排序
【发布时间】:2013-01-08 05:20:16
【问题描述】:

我有一个像下面这样的对象。尝试根据值以升序重新排列它。类似于 Javascript 数组排序方法。

    var masterList = {
    "1": "google",
    "2": "yahoo",
    "3": "msn",
    "4": "*",
    "5": "github",
    "6": "jsfiddle",
    "7": "amazon",
    "8": "ebay"
}

请告诉我更好的解决方案...

【问题讨论】:

标签: javascript jquery


【解决方案1】:

JavaScript 对象没有顺序。尽管大多数浏览器确实以创建属性的相同顺序进行迭代,但无法保证,因此对象不支持排序。

查看这里了解更多信息:Does JavaScript Guarantee Object Property Order?

您可能还对John Resig has got to say 对此事感兴趣。


如果您需要可排序的列表,则必须将其存储为对象数组:

var masterList = [
    { key: 1, val: "google" },
    { key: 2, val: "yahoo" },
    { key: 3, val: "msn" },
    { key: 4, val: "*" },
    { key: 5, val: "github" },
    { key: 6, val: "jsfiddle" },
    { key: 7, val: "amazon" },
    { key: 8, val: "ebay" }
];

然后,对它们进行排序,只需使用常规数组的sort 方法:

masterList = masterList.sort(function (a, b) {
    return a.val.localeCompare( b.val );
});

这是小提琴:http://jsfiddle.net/ASrUD/

【讨论】:

  • 也许我只是不理解 sort(),但这不适用于数值。尝试按“键”排序返回未定义的函数。
  • @dval - 让你失望的是localeCompare。如果您按key 排序,则只需return a - b
  • @Joseph Silber 啊!完美的。谢谢。
  • 与@dval 类似的问题,我将如何对值(而不是键)进行数字排序?我的数组看起来与此类似...[ {key:"Designer", val:0}, {key:"Developer", val:2}, {key:"Engineer", val:1} ]
  • @FinbarMaginn - list = list.sort(function(a, b){ return a.val - b.val; });
【解决方案2】:

    var obj = {
        "1": "google",
        "2": "yahoo",
        "3": "msn",
        "4": "*",
        "5": "github",
        "6": "jsfiddle",
        "7": "amazon",
        "8": "ebay"
    };

    var arr = [];

    for (var key in obj) {
        if (obj.hasOwnProperty(key)) {
            arr.push(obj[key]);
        }
    }
    
    alert(arr.sort());

这将按升序对您的值进行排序。让我给您一些时间,让您了解如何将其转换为对象。

【讨论】:

  • 此解决方案的唯一问题是您错过了结果数组中的键值
【解决方案3】:

var masterList = {
    "2": "yahoo",
    "3": "msn",
    "4": "*",
    "5": "github",
    "6": "jsfiddle",
    "7": "amazon",
    "8": "ebay",
    "1": "google",
   }
var masterList_ = {}

Object.keys(masterList).sort().forEach(a=>masterList_[a]=masterList[a])
console.log(masterList_)

【讨论】: