16

我如何按键对字典进行排序

dict["word_21"] = "Hello Java";
dict["word_22"] = "Hello World";
dict["word_11"] = "Hello Javascript";

所以我得到

dict["word_22"] = "Hello World";
dict["word_21"] = "Hello Java";
dict["word_11"] = "Hello Javascript";

仅索引上有 word_number 组合,值是字符串。索引是不同的(没有相等的值),但在错误情况下可能是“未定义的”

编辑:其实我需要它的降序和升序。但是降序是我目前需要的。

4

5 回答 5

27

此处用作键值映射(称为“字典”)的 javascript 对象没有顺序;IE。你不能排序。

你需要一个数组,例如

[
    {id: "word_11", entry:"Hello Javascript"},
    {id: "word_21", entry:"Hello Java"},
    {id: "word_22", entry:"Hello World"},
]

然后您可以按id 或按条目对其进行排序。您可以为此使用您的 id-sort-algorithm


或者,您可以在未排序的数据结构旁边使用一组键进行排序。这可能是最好(有效)和最简单的方法:

var dict = {
    "word_21": "Hello Java",
    "word_22": "Hello World",
    "word_11": "Hello Javascript"
}; // init (like your example)

var keys = Object.keys(dict); // or loop over the object to get the array
// keys will be in any order
keys.sort(); // maybe use custom sort, to change direction use .reverse()
// keys now will be in wanted order

for (var i=0; i<keys.length; i++) { // now lets iterate in sort order
    var key = keys[i];
    var value = dict[key];
    /* do something with key & value here */
} 
于 2012-06-08T11:18:14.150 回答
26

试试这个

var sorted = [];
for(var key in dict) {
    sorted[sorted.length] = key;
}
sorted.sort();

对它的键进行排序dict并将其写回对象对我来说没有意义,但它是这样的:

function sortOnKeys(dict) {

    var sorted = [];
    for(var key in dict) {
        sorted[sorted.length] = key;
    }
    sorted.sort();

    var tempDict = {};
    for(var i = 0; i < sorted.length; i++) {
        tempDict[sorted[i]] = dict[sorted[i]];
    }

    return tempDict;
}

dict = sortOnKeys(dict);
于 2012-06-08T10:16:50.637 回答
5

如果您只想对对象中的键进行排序,则可以使用以下方法(它是单行)

/**
 * (typescript) returns the given object with keys sorted alphanumerically.
 * @param {T} obj the object to sort
 * @returns {T} the sorted object
 */
 const sort = <T extends object>(obj: T): T => Object.keys(obj).sort()
        .reduce((acc, c) => { acc[c] = obj[c]; return acc }, {}) as T

或在javascript中相同

/**
 * (javascript) returns the given object with keys sorted alphanumerically.
 * @param {T} obj the object to sort
 * @returns {T} the sorted object
 */
 const sort = (obj) => Object.keys(obj).sort()
        .reduce((acc, c) => { acc[c] = obj[c]; return acc }, {})
于 2017-10-23T21:02:04.667 回答
1

@Amberlamps 不错的解决方案大部分时间都有效。但是,OP 是正确的,某些键存在拆分问题。javascript 中 sort() 的默认行为是使用字符串 Unicode 代码点来确定元素的顺序。例如,使用 @Amberlamps 方法无法正确排序以下键:

canvas_2_1/15/2018__2:55:20_PM

canvas_24_1/15/2018__2:55:20_PM

但是我们可以利用 sort() 接受一个可选参数的事实来自定义排序方法,该参数是一个比较数组的 2 个元素的函数。

通过自定义比较函数的排序逻辑并将其传递给 sort() 方法,上面的键得到正确排序:

sorted.sort(function(a, b) {
    a = parseInt(get_between(a, 'canvas_', '_'));
    b = parseInt(get_between(b, 'canvas_', '_'));
    if (a > b) {
        return 1;
    }
    if (b > a) {
        return -1;
    }
    return 0;
    });

在这种情况下,我使用以下 get_between 方法:

function get_between(str, char_a, char_b) {
   res = str.split(char_a).pop().split(char_b).shift();
   return(res)
}

要点是,如果您有棘手的键(可能是也可能不是“正确”使用 dict),您可以调整排序功能以仍然正确排序。

于 2018-01-15T23:11:32.633 回答
0

简单地说,字典类型没有 keys() 方法,而 Object 类型有。您可以将 Object.keys() 方法传递给可迭代对象,并将键作为具有 .sort() 方法的列表返回。

Object.keys({r:2,d:2,c:3,p:0})
// returns ["r", "d", "c", "p"]
Object.keys({r:2,d:2,c:3,p:0}).sort()
// returns ["c", "d", "p", "r"]
Object.keys([6,7,8,9])
// returns ["0", "1", "2", "3"]

最后,让我们jsFiddle OP 的代码

更新:Bergi 的答案太多了,我完全错过了“好答案”部分。我什至没有注意到他做了我在 jsFiddle 中所做的同样的事情。

于 2014-11-10T18:20:52.883 回答