对对象内的javascript键/值对进行排序

时间:2013-12-20 08:16:46

标签: javascript sorting

我在对象内部排序项时遇到了一些问题。所以我有这样的事情:

var someObject = {
    'type1': 'abc',
    'type2': 'gty',
    'type3': 'qwe',
    'type4': 'bbvdd',
    'type5': 'zxczvdf'
};

我想按值排序someObject,这就是我遇到问题的地方。 我有排序函数,应返回按值排序的键/值对:

function SortObject(passedObject) {
    var values = [];
    var sorted_obj = {};

    for (var key in passedObject) {
        if (passedObject.hasOwnProperty(key)) {
            values.push(passedObject[key]);
        }
    }

    // sort keys
    values.sort();

    // create new object based on Sorted Keys
    jQuery.each(values, function (i, value) {
        var key = GetKey(passedObject, value);
        sorted_obj[key] = value;
    });

    return sorted_obj;
}

和获取密钥的功能:

function GetKey(someObject, value) {
    for (var key in someObject) {
        if (someObject[key] === value) {
            return key;
        }
    }
}

在创建新的返回对象时,问题出在最后一部分 - 它再次按键排序。为什么?这是特定情况,当我必须操作对象不在数组上时(是的,我知道这会更容易......)

有谁知道如何对对象中的项目进行排序?

2 个答案:

答案 0 :(得分:3)

普通物品根本没有订单。数组 - 这是一种特殊类型的对象 -

您可以拥有的最接近的是一个对象值已排序的数组。例如:

 _valuesOfAnObjectSorted = Object.keys(object).map(function(k){ return object[k]; }).sort();

答案 1 :(得分:2)

您有两种可能性:

将对象重构为数组

这样的事情:

var myObj = [
    ['type1', 'abc'],
    ['type2', 'gty'],
    ...
];

甚至更好,因为在某处使用它不会依赖于数组位置而是完全命名的键:

var myObj = [
    {name: 'type1', val:'abc'},
    {name: 'type2', val:'gty'},
    ...
];

将您的对象与辅助数组一起使用

无论您希望使用按键排序的对象,都可以将键提取为数组,对其进行排序并遍历它以访问对象

var ordKeys = Object.keys(myObj).sort(); // pass inside a function if you want specific order
var key;
for (var i = 0, len = ordKeys.length; i < len; i +=1) {
    key = ordKeys[i]
    alert(key + " - " + myObj[key]);
}

两者的组合

如果对象不是由您构造的,而是来自其他地方,则可以使用第二个选项方法来构造对象数组,如第一个选项中所示。这样可以让您在任何地方使用完美的订单。

修改

您可能想要检查库underscore.js。在那里你有非常有用的方法,可以很容易地完成这个技巧。可能具有一些映射的方法_.pairs将在一个语句中完成所有工作。