2016-03-15 78 views
0

我正在尝试通过其中一个值从最小到最大排序一个对象。例如:按其值之一对对象排序

{ 
    obj1: { 
     key1: something, 
     key2: 54, 
     key3: "something else" 
    }, 
    obj2:{ 
     key1: something, 
     key2: 27, 
     key3: "another thing" 
    }, 
    obj3:{ 
     key1: anotherSomething, 
     key2: 78, 
     key3: "whatever" 
    } 
} 

应,当key2排序,出来为obj2obj1obj3。有什么办法可以做到这一点?

P.S.我已经看到堆栈溢出中有一些类似的线程,但它们是通过一个没有嵌套的对象进行排序的,即{ obj1: 5, obj2: 3, obj3: 8}

+2

您所要求的是不可能的 - 您无法对对象的属性进行排序。作为一种替代方法,你可以将此转换为对象的数组,然后使用'排序()' –

+0

*“我已经看到了,有一些类似的线程这个堆栈溢出” *不管他们建议那里,你可以在这里申请。 –

+0

@RoryMcCrossan是否可以使用排序算法?我会给你一个代码。 – yul757

回答

1

如果你不能改变的对象数组(如你在一个评论告诉我们),你可能会引入与阵列引用您想要排序的对象,然后使用该数组访问这些对象:

var obj = { 
    obj1: { 
     key1: something, 
     key2: 54, 
     key3: "something else" 
    }, 
    obj2:{ 
     key1: something, 
     key2: 27, 
     key3: "another thing" 
    }, 
    obj3:{ 
     key1: anotherSomething, 
     key2: 78, 
     key3: "whatever" 
    } 
}; 

var arr = [ obj.obj1, obj.obj2, obj.obj3 ]; 
arr.sort(function(a, b){ 
    return a.key2 - b.key2; 
}); 
+0

是的,这工作:)谢谢 –

0

首先,您需要将对象转换为数组。这是必须的,因为对象字段不是按性质排序的。这里有这样一个数组的例子:

var arr = 
[ 
    { 
     key1: something, 
     key2: 54, 
     key3: "something else" 
    }, 
    { 
     key1: something, 
     key2: 27, 
     key3: "another thing" 
    }, 
    { 
     key1: anotherSomething, 
     key2: 78, 
     key3: "whatever" 
    } 
]; 

当你有一个数组,你可以将其以不同的方式元素进行排序。例如,如果你使用Underscore.js,你可以这样做:

_.sortBy(arr, 'key2'); 
+0

不幸的是我使用的火力地堡,所以我不能改变它到一个数组:( –

+1

我不KNW火力地堡,但我相信,如果它是支持Javascript和JS对象,它将支持阵列了。如果你不能能够使用下划线.js你可以尝试一些排序算法,但你不应该知道数组不会支持。 –