尝试使用Javascript和下划线按对象属性对{key:object}对进行排序

尝试使用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,

我想根据粉丝来分类。例如,在这种情况下,它应该是“TR”、“MX”、“US”。。。如果有帮助的话,可以使用JS和下划线。
谢谢

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谢谢这是一个很棒的答案,我从中学到了很多