繁体   English   中英

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

[英]Sort javascript key/value pairs inside object

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

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;
        }
    }
}

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

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

普通对象根本没有顺序。 数组是一种特殊的对象类型。

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

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

您有两种可能性:

将对象重构为数组

像这样:

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可能会在一条语句中完成所有工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM