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

时间:2013-12-12 23:40:12

标签: javascript sorting object underscore.js

{
  "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。 谢谢!

5 个答案:

答案 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.keysArray.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怪物钉了它,但我认为这是一个有用的讨论,即使ownPropsObject.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)

解决方案:http://jsfiddle.net/az7XN/

我们可以说整个粉丝对象都是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))。

使用过的功能:

for..in

Array.prototype.sort()

parseInt()