按每个对象中的数字对对象数组进行排序

时间:2014-08-07 11:12:07

标签: jquery arrays sorting

我有一个对象数组:

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});

...但是如何在那里保留标签的相关键/属性值呢?

3 个答案:

答案 0 :(得分:0)

您可以尝试:只需要使用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

答案 1 :(得分:0)

传递给sort函数的排序函数的参数是数组中的两个对象。你传入了a.num和b.num,在我看来你误解了传入的内容。传入的参数是数组中的两个元素(每个元素都是一个带有label-和num-property的对象)。您应该将它们命名为a和b,以便通过a.num和b.num查询其属性num是正确的。在排序功能中,您可以使用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

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

答案 2 :(得分:0)

你也可以从各种图书馆获得现成的功能..我个人更喜欢$ 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();