我有一个对象数组:
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});
...但是如何在那里保留标签的相关键/属性值呢?
答案 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();