{
"TR":{
"total_fans":1848,
"country_name":"Turkey"
},
"US":{
"total_fans":1097,
"country_name":"United States"
},
"DE":{
"total_fans":915,
"country_name":"Germany"
},
"MX":{
"total_fans":1148,
"country_name":"Mexico"
},
"RS":{
"total_fans":359,
"country_name":"Serbia"
},
"IT":{
"total_fans":798,
"country_name":"Italy"
}
}
我想根据粉丝对此进行排序。例如,在这种情况下,如果有帮助,它应该是“TR”,“MX”,“US”......等等使用JS和Underscore。 谢谢!
答案 0 :(得分:4)
JavaScript对象是无序的,因此您将无法对特定订单进行排序或定义。
您可以将属性转换为数组,然后对其进行排序,但这与您将获得的结果非常接近。
由于您似乎希望按粉丝数量进行排序,因此可以执行此操作。
Object.keys(myObject)
.sort(function(a,b) {
return myObject[a].total_fans - myObject[b].total_fans;
}).forEach(function(key) {
console.log(myObject[key]);
});
要支持IE8及更低版本,您需要Object.keys
和Array.prototype.forEach
的补丁。
正如Bruce Lim所说,这是一种提升的方式。要下降,请在-
之后交换return
运算符的操作数。
return myObject[b].total_fans - myObject[a].total_fans;
答案 1 :(得分:1)
尝试使用数组进行排序:
var array = [];
// copy object to array
for (var x in yourObject) array.push([x, yourObject[x].total_fans]);
// sort array
array.sort(function(item1, item2) { return item1[1] - item2[1] });
// now get the keys
var keys = [];
for (var i = 0; i < array.length; i ++) keys.push(array[i][0]);
// keys = ["RS", "IT", "DE", "US", "MX", "TR"]
请注意,如果您不关心旧的IE,则map
可以更轻松地获取键获取步骤。
答案 2 :(得分:1)
如果您不关心IE&lt;
,则不需要下划线。 9.鉴于您的结构位于变量obj
:
var sorted = Object
.keys(obj)
.map(function(key) {
// Put the country in the item?
obj[key].country = key;
return obj[key];
})
.sort(function(a, b) {
if (a.total_fans > b.total_fans) {
return -1;
} else if (b.total_fans > a.total_fans) {
return 1;
}
return 0;
});
这将为您提供一个Array
,其中排序的粉丝数量最多,并在需要时添加每个项目的国家/地区代码(如果不必要,则省略)。
答案 3 :(得分:1)
更新:由于与Doorknob进行了热烈而有用的交流,我意识到他对于修改Object.prototype
时要小心谨慎。我通过使新方法不可枚举来修改答案,使Object.prototype
的扩展更少侵入。谢谢,Doorknob!
更新2 :我现在意识到OP的明智选择正确答案是否有权利。 Object.keys
正是我的ownProps
方法(见下文)所做的,它是一个标准(尽管你仍然需要在IE8中进行polyfill)。我会删除这个答案,因为cookie怪物钉了它,但我认为这是一个有用的讨论,即使ownProps
与Object.keys
是多余的,它也可能教别人......某事。
我编写了一个名为ownProps
的便捷函数,它返回一个对象的所有属性名称(不包括原型链中的属性)。这是Doorknob建议的更实用的方式:
// retrieves all of the properties of an object as an array,
// omitting properties in the prototype chain; note that we use
// Object.defineProperty so we can make this non-enumerable, thereby
// making a safer modification of Object.prototype
Object.defineProperty(Object.prototype,'ownProps',{
enumerable: false,
value: function() {
var props = []; for( var prop in this ) {
if( this.hasOwnProperty( prop ) ) props.push( prop );
}
return props;
}
});
有了这个,您可以使用自定义排序功能对对象进行排序:
var obj = {"TR":{"fans":1848,"country_name":"Turkey"}/*...*/}
var sortedKeys = obj.ownProps().sort(function(a,b){
return obj[a].fans - obj[b].fans;
});
答案 4 :(得分:-1)
我们可以说整个粉丝对象都是fansObj
:
for(prop in fansObj){
console.log(prop, fansObj[prop]);
}
输出示例:TR, {"fans":1848,"country_name":"Turkey" }
在for
圈声明数组变量之前,将每个obj推送到那里:
var arr = [];
for(prop in fansObj){
console.log(prop, fansObj[prop]);
arr.push(fansObj[prop]);
}
然后排序:
arr.sort(function(a,b){parseInt(b['total_fans'],10) - parseInt(a['total_fans'])});
parseInt(obj,10)
将接受将对象转换为十进制为整数。
现在你已经对数组进行了排序(取决于排序函数内的比较(a-b = desc或b-a = asc))。
使用过的功能: