基于值对JavaScript键值对对象进行排序

31

我有一个如下的对象。试图按值的大小重新排列它,类似于JavaScript中的数组排序方法。

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

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


这篇文章将帮助你学习如何做到这一点,https://dev59.com/InNA5IYBdhLWcg3wpfmu - Adil
3个回答

63

JavaScript对象没有顺序。尽管大多数浏览器按照属性创建的顺序迭代,但没有保证,因此不支持排序对象。

更多信息请参见: Does JavaScript Guarantee Object Property Order?

您可能还对John Resig关于这个问题的观点感兴趣。


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

var masterList = [
    { key: 1, val: "google" },
    { key: 2, val: "yahoo" },
    { key: 3, val: "msn" },
    { key: 4, val: "stackoverflow" },
    { 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 );
});

这里是fiddle代码示例:http://jsfiddle.net/ASrUD/


也许我只是不理解sort(),但它对于数值类型似乎无效。尝试按'key'排序会返回未定义的函数。 - dval
3
“localeCompare”可能让您感到困惑。如果您要按“key”排序,只需返回“a - b”。 - Joseph Silber
@Joseph Silber 哦!太好了。谢谢。 - dval
类似@dval的问题,我如何按数值(而不是键)对值进行排序?我的数组看起来类似于这样...[ {key:"设计师", val:0}, {key:"开发人员", val:2}, {key:"工程师", val:1} ] - Finbar Maginn
3
@FinbarMaginn - list = list.sort(function(a, b){ return a.val - b.val; }); - Joseph Silber
@JosephSilber 这对我没用 var arr = ["loc1", "loc2", "loc3", "loc4"]; var key = [5,3,1,2] console.log(arr.length); var obj = {}; for(i=0;i<arr.length;i++) { obj[arr[i]] = key[i]; } console.log(obj) obj = Object.entries(obj); console.log(obj)list = obj.sort(function (a, b) { return a - b; }); console.log(list)输出结果 4 { loc1: 5, loc2: 3, loc3: 1, loc4: 2 } [ [ 'loc1', 5 ], [ 'loc2', 3 ], [ 'loc3', 1 ], [ 'loc4', 2 ] ] [ [ 'loc1', 5 ], [ 'loc2', 3 ], [ 'loc3', 1 ], [ 'loc4', 2 ] ] - SudhirKumar

9

    var obj = {
        "1": "google",
        "2": "yahoo",
        "3": "msn",
        "4": "stackoverflow",
        "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());

这将按升序对您的值进行排序。让我花点时间,回复您如何将其转换为对象。

1
这种解决方案唯一的问题是,你会在最终数组中丢失关键值。 - Alex

1

var masterList = {
    "2": "yahoo",
    "3": "msn",
    "4": "stackoverflow",
    "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_)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接