如何按子对象值对对象进行排序?

时间:2017-10-22 08:13:39

标签: javascript

我有一个这样的对象:

let objectExample = {
    key1: { prop1: '123', prop2: 'def' },
    key2: { prop1: '456', prop2: 'ghi' },
    key3: { prop1: '789', prop2: 'abc' }
};

prop2的值排序后需要它像这样。

let objectSorted = {
    key3: { prop1: '789', prop2: 'abc' },
    key1: { prop1: '123', prop2: 'def' },
    key2: { prop1: '456', prop2: 'ghi' }
};

我在这里看到了一些例子,但它们现在看起来太难以理解并且吓唬我作为初学者:D 6年前我也看到过这个问题。

4 个答案:

答案 0 :(得分:0)

无法对对象属性进行排序,它们没有索引顺序。如果要保持元素的特定顺序,则必须使用数组,而不是对象。这是一个例子,如何按字母顺序对数组进行排序:

let arrExample = [
    { prop1: '123', prop2: 'def' },
    { prop1: '456', prop2: 'ghi' },
    { prop1: '789', prop2: 'abc' }
];

arrExample.sort(function(a, b){
    if(a.prop2 < b.prop2) return -1;
    if(a.prop2 > b.prop2) return 1;
    return 0;
})

console.log(arrExample);

答案 1 :(得分:0)

抱歉,现在没有笔记本电脑。但是下面的代码应该有所帮助。

The vectorize function is provided primarily for convenience, not for performance. The implementation is essentially a for loop.

答案 2 :(得分:0)

我不会依赖对象键顺序。最合适的是使用数组进行排序,因为它们是明确排序的。对于对象键,您应该将它们视为有序...我会将它们视为一组。

这样说,对象键最后有一个顺序,即插入顺序,就像用for..in或使用Object.keys迭代它们时所示。在设置密钥后,您无法轻松修改密钥的顺序,唯一的选择是删除密钥,然后再次设置密钥,这样就可以&#34;移动&#34;它进入了最后的位置。但是,即使有可能做这种事情,我根本不会推荐它......甚至更少尝试对它们进行排序。使用数组,然后使用数组提供的排序方法。

答案 3 :(得分:0)

Property order is predictable in JavaScript objects since ES2015

除了对象排序外,您还可以执行其他操作。例如输出一个有序列表。
然后这是跨浏览器的IE9 +解决方案
而且,不需要任何中间阵列

1.  var objectSorted = {}, x, y
2.  var size = Object.keys(objectExample).length; //IE9+
3.  while (size--) {
4.    y = null
5.    for (var key in objectExample) {
6.      var z = objectExample[key].prop2;
7.      if (!objectExample.hasOwnProperty(key)) continue;
8.      if (!y || z < y) {
9.        x = key
10.       y = z;
11.     }
12.   }
13.
14.   objectSorted[x] = objectExample[x];
15.
16.   delete objectExample[x]
17. }

一些说明

2获得length of object
4 y将是找到的下一个最低字符串。忘记删除的了。
5使用for-in迭代对象。
6假设z是要排序的属性。
7根据here跳过最终的原型。
8如果找到的字符串比最低的字符串小,则...
9记住找到的最低字符串的键。
10并记住找到的最低的字符串。
14推入具有找到值的新对象。
16从旧对象中删除键及其值。