您无法可靠地对 JavaScript 对象进行排序。ES5 第 12.6.4 节 says:
枚举属性的机制和顺序(第一个算法中的步骤 6.a,第二个算法中的步骤 7.a)未指定。
Section 15.2.3.7 says:
如果实现为 for-in 语句定义了特定的枚举顺序,则必须使用相同的枚举顺序来对该算法的步骤 3 中的列表元素进行排序。
第15.2.3.14节 (Object.keys
) says:
如果实现为 for-in 语句定义了特定的枚举顺序,则必须在此算法的步骤 5 中使用相同的枚举顺序。
您还可以查看部分8.6 对象类型查看是否有提及属性顺序(提示:没有)。因此,在 ES5 中,属性顺序是依赖于实现的,唯一的限制或多或少是,如果在任何地方都有定义的顺序,那么该顺序必须在任何地方都相同。
ES6 草案包含类似的语言第9.1.11节:
枚举属性的机制和顺序未指定,但必须符合下面指定的规则。
因此,对象中的事物绝对不存在可移植且可靠的顺序。
不,你也不能通过 JSON 作为JSON 将对象定义为:
...一组无序的名称/值对
一些 JavaScript 实现将按插入顺序对对象进行排序,但您不能依赖于此。
您能做的最好的事情就是将您的对象转换为数组数组,如下所示:
var sorted = _(obj).chain()
.pairs()
.sortBy(_.last)
.value();
或对象数组:
var sorted2 = _(obj).chain()
.pairs()
.sortBy(_.last)
.map(function(a) { return _([a]).object() })
.value();
Demo: http://jsfiddle.net/ambigously/76ZPx/