有效地对word_number键上的字典(或js中的任何键值数据结构)进行排序

我如何按键排序字典

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组合,值是字符串。 索引是不同的(没有相等的值)但在错误情况下可能是“未定义的”

编辑:其实我需要它的降序和升序。 但是降序是我现在所需要的。

试试这个

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

一个javascript对象,这里用作键值映射(称为“字典”),没有顺序; 即。 你无法对它进行排序。

你需要一个数组,例如

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

然后你可以通过 id或entry进行排序 。 你可以使用你的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 

如果你只想对一个对象中的键进行排序,那么下面就好了(它是一个单行)

 /** * (typescript) returns the given object with keys sorted alphanumerically. * @param {T} obj the object to sort * @returns {T} the sorted object */ const sort = (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 }, {}) 

简单地说,字典类型没有keys()方法,而Object类型则没有。 您可以将Object.keys()方法传递给iterable,并将键作为具有.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"] 

最后,让我们来看看OP的代码 。

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

@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()接受一个可选参数来自定义sort方法,该参数是一个比较数组的2个元素的函数

通过自定义compare函数的排序逻辑并将其传递给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)你可以调整排序function仍然正确排序。