【问题标题】:Sort javascript key/value pairs inside object对对象内的 javascript 键/值对进行排序
【发布时间】:2013-12-20 08:16:46
【问题描述】:

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

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

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

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

【问题讨论】:

  • 没有理由对对象进行排序。对象的属性始终按字母顺序显示。
  • 此键/值对是下拉列表的提要。该列表应按值排序。我不知道如何实现这一点。
  • 数组排序是有效的,但你的是一个对象
  • 我知道。我认为这是可能的。正如我在一些教程中看到的那样,javascript 对象没有排序 - 但我的是。无论以哪种顺序,它都按键对数组进行排序。

标签: javascript sorting


【解决方案1】:

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

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

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

【讨论】:

  • 此方法正在丢失密钥。
【解决方案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 可以在一个语句中完成所有工作。

【讨论】:

  • 我认为还有第三种解决方案 - 每当我想使用已排序的键/值对时,我都可以将其映射到已排序的数组并使用它来显示等。这不是一个繁重的操作,所以我可以做到它是动态的,可以吗?
  • 这不是第二种选择吗?
最近更新 更多