尝试使用Javascript和下划线按对象属性对{key:object}对进行排序
我想根据粉丝来分类。例如,在这种情况下,它应该是“TR”、“MX”、“US”。。。如果有帮助的话,可以使用JS和下划线。尝试使用Javascript和下划线按对象属性对{key:object}对进行排序,javascript,sorting,object,underscore.js,Javascript,Sorting,Object,Underscore.js,我想根据粉丝来分类。例如,在这种情况下,它应该是“TR”、“MX”、“US”。。。如果有帮助的话,可以使用JS和下划线。 谢谢 JavaScript对象是无序的,因此您将无法排序或以其他方式定义特定顺序 您可以将属性转换为数组,并对其进行排序,但这是最接近的结果 既然你想按粉丝的数量排序,你可以这样做 { "TR":{ "total_fans":1848, "country_name":"Turkey" }, "US":{ "total_fans":1097,
谢谢 JavaScript对象是无序的,因此您将无法排序或以其他方式定义特定顺序 您可以将属性转换为数组,并对其进行排序,但这是最接近的结果 既然你想按粉丝的数量排序,你可以这样做
{
"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"
}
}
要支持IE8及更低版本,您需要为对象.keys
和数组.prototype.forEach
提供补丁
正如Bruce Lim所指出的,这是一种升序。要下降,请在返回
之后交换-
运算符的操作数
Object.keys(myObject)
.sort(function(a,b) {
return myObject[a].total_fans - myObject[b].total_fans;
}).forEach(function(key) {
console.log(myObject[key]);
});
尝试使用数组进行排序:
return myObject[b].total_fans - myObject[a].total_fans;
var数组=[];
//将对象复制到数组
for(在yourObject中的变量x)数组.push([x,yourObject[x].total_fans]);
//排序数组
sort(函数(item1,item2){returnitem1[1]-item2[1]});
//现在去拿钥匙
var键=[];
对于(vari=0;i
请注意,如果您不关心旧的IEs,则使用map
可以更轻松地完成获取密钥的步骤。解决方案:
假设你的粉丝对象是一个fansObj
:
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"]
arr.sort(function(a,b){parseInt(b['total_fans'],10) - parseInt(a['total_fans'])});
输出示例:TR,{“fans”:1848,“国家名称”:“土耳其”}
在for
之前,圈出declare array variable并将每个obj推到那里:
for(prop in fansObj){
console.log(prop, fansObj[prop]);
}
然后排序:
var arr = [];
for(prop in fansObj){
console.log(prop, fansObj[prop]);
arr.push(fansObj[prop]);
}
parseInt(obj,10)
将接受将对象转换为十进制到整数
现在您有了排序数组(取决于排序函数(a-b=desc或b-a=asc)内部的比较)
使用的功能:
// 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;
}
});
如果您不关心IE<9,则不需要下划线。假设您的结构位于变量
obj
:
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"]
arr.sort(function(a,b){parseInt(b['total_fans'],10) - parseInt(a['total_fans'])});
这将为您提供一个
数组
,其中风扇最多的项目排在第一位,并在需要时将国家/地区代码添加到每个项目中(如果不需要,请省略)。更新:多亏了与门把手进行了加热但有用的交换,我意识到他在修改Object.prototype
时非常谨慎。我修改了答案,通过使新方法不可枚举,使Object.prototype
的扩展不那么麻烦。谢谢,门把手
更新2:我现在意识到OP明智地选择了正确的答案Object.keys
的功能与我的ownProps
方法(见下文)的功能完全相同,而且它是一个标准(尽管您仍然需要填写IE8)。我想删除这个答案,因为cookie monster把它钉死了,但我认为这是一个有用的讨论,尽管ownProps
与Object.keys
是多余的,但它可能会教给某人一些东西
我编写了一个名为ownProps
的便利函数,它返回对象的所有属性名(不包括原型链中的属性)。这是一种更实用的方法,可以实现上面提到的“门把手”的功能:
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;
});
有了此功能,您可以使用自定义排序函数对对象进行排序:
// 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;
}
});
对象上的语法错误。。。这就是整件东西吗?我编辑了它,我想我弄糟了什么,但看起来门把手把它修好了。是否有一种方法可以在stackoverflow中格式化它,而不使用空格?他实际上想按风扇排序。@natecraft1将属性更改为total_fans顺便说一句。它可以对ASC进行排序。要对DSC进行排序,请返回myObject[b]。总计\u个风扇-myObject[a]。总计\u个风扇+哇,干得好,饼干怪兽!我完全忘记了
Object.keys
…它正是我试图用Object.ownProps
做的,但更标准。你的答案显然是最好的。@EthanBrown:谢谢!:-)哟,饼干,好东西。你会给这个问题起什么名字,这样大多数有相同问题的人都会遇到它?我还在学行话;)不同意,门把手。JavaScript的魅力之一。道格拉斯·克罗克福德(Douglas Crockford)说的并不是每一句话都是金子做的。好吧,假设有人去做了如果(someVariable.ownProps===未定义)someVariable.ownProps=['some','stuff']
。哎呀,你的代码破坏了这一点:(与…相反,你还做了什么?如果我没有在对象上创建一个自定义函数。prototype
,那会怎么样?有人可能会出现并覆盖它。在JavaScript中,有无数的机会把事情搞砸……这是野兽本性的一部分。虽然我不会随意修改对象。prototype
出于你所说的理由,一些位置合理的扩展并不是世界末日。FWIW,“道格拉斯·克罗克福德说的并不是每一件事都是镀金的。”这是一个我完全同意的说法!;-DUPDATE:added sort。首先,我写了如何在object中抛出所有属性,然后添加了sort。没有必要使用parseInt
。total\u fans
属性已经是一个数字了。@EthanBrown是的,你是对的,但我认为这是JSON中的字符串,所以我添加了parse。它是n最好使用整数解析器,因为在javascript中,您可以将任何内容设置为total\u fans
jacob谢谢这是一个很棒的答案,我从中学到了很多