【问题标题】:Sorting an array of objects by a number in each object按每个对象中的数字对对象数组进行排序
【发布时间】:2014-08-07 11:12:06
【问题描述】:

我有一个对象数组:

var points = [{num:40, label:"category1"}, {num:100, label:"category2"}, {num:1, label:"category3"}, {num:5, label:"category4"}, {num:25, label:"category5"}, {num:10, label:"category6"}];

我想创建一个函数来创建这些对象的新数组,这些对象按点数(降序)的 num 属性排序

所以新数组将如下所示:

var newpoints =[{num:100, label:"category2"}, {num:40, label:"category1"}, {num:25, label:"category5"}, {num:10, label:"category6"}, {num:5, label:"category4"}, {num:1, label:"category3"}];

我想我可以在点上调用 .sort() 并传递一个匿名函数,该函数返回其数字降序排列的数组:

var newpoints = points.sort(function(a.num,b.num){return b.num-a.num});

...但是我如何也将标签的关联键/属性值也保留在那里?

【问题讨论】:

标签: jquery arrays sorting


【解决方案1】:

你可以试试这个:只需要使用parseInt()将字符串解析为数字

$(function(){
var points = [{num:40, label:"category1"}, {num:100, label:"category2"}, {num:1, label:"category3"}, {num:5, label:"category4"}, {num:25, label:"category5"}, {num:10, label:"category6"}];
   //alert(JSON.stringify( points ));
    var newpoints = points.sort(function(a, b){    if(parseInt(a.num) > parseInt(b.num)) return 1;else if(parseInt(a.num) < parseInt(b.num)) return -1;else return 0});
   // alert(JSON.stringify( newpoints ));
});

Demo

【讨论】:

    【解决方案2】:

    您也可以从各种库中获得现成的功能。我个人更喜欢 $linq :http://jscriptlinq.codeplex.com/

    基于属性的简单排序可以实现为

    var arr = [{id: 'a', pos: 5},
        {id: 'd', pos: 2},
        {id: 'b', pos: 4},
        {id: 'c', pos: 3},
        {id: 'e', pos: 1}];
    
    // col1 = ['e', 'd', 'c', 'b', 'a']
    var col1 = $linq(arr)
        .orderBy(function (x) { return x.pos; })
        .select(function (x) { return x.id; })
        .toArray();
    
    // col2 = ['a', 'b', 'c', 'd', 'e']
    var col2 = $linq(arr)
        .orderBy("x => x.id")
        .select("x => x.id")
        .toArray();
    

    【讨论】:

      【解决方案3】:

      传递给排序函数的排序函数的参数是数组中的两个对象。你传入了 a.num 和 b.num ,在我看来你误解了传入的内容。传入的参数是数组中的两个元素(每个元素都是带有标签和 num 属性的对象)。您应该将它们命名为 a 和 b,以便通过 a.num 和 b.num 查询它们的属性 num 是正确的。在 ordering 函数中,您可以使用 num-property 作为比较的基础,如下所示:

      var points = [{num:40, label:"category1"}, {num:100, label:"category2"}, {num:1,   label:"category3"}, {num:5, label:"category4"}, {num:25, label:"category5"}, {num:10, label:"category6"}];
      
      points.sort(function(a,b){return b.num - a.num}); // Sorts the array in place
      

      标签将保持不变 - 每个对象将具有与排序前相同的标签。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-05-16
        • 1970-01-01
        • 2020-07-11
        • 2015-03-11
        • 1970-01-01
        相关资源
        最近更新 更多