所以我有一个对象数组,例如:
var a = {user: [
{year:'1950',name:'Joe'},
{year:'19XX',name:'Chris'},
{year:'1980',name:'Bob'},
{year:'1955',name:'Jan'}
]}
我使用这些数据来模板化包含年份和名称的简单元素。
我也可以通过select元素来对这些数据进行排序,然后使用sorted按排序顺序再次将其模板化。 (鲍勃,克里斯,简,乔)或年份。
但我的问题始于年份。
我需要继续使用简单的插件jsonQ(http://ignitersworld.com/lab/jsonQ.html)
编辑和排序数据,并且需要一年的数据实际上与desc或asc有所不同。
首先,我需要编辑各个部分的数据,例如年份(19XX应该变成“1950年前”):
//inside ajax success function
var dataObj = jsonQ(data);
dataObj.find('year').value(function (data){
if (data == '19XX') {
return 'pre 1953'
} else {
return data;
}
});
现在,我将有一个需要排序的最终产品数据集。
var orderedData = dataObj.sort('year', {'order' : 'ASC'});
但这给了我数据如下:
{
user: [
{year:'1950',name:'Joe'},
{year:'1955',name:'Jan'},
{year:'1980',name:'Bob'},
{year:'Pre 1950',name:'Chris'}
]
}
我需要的是要返回的数据为:
{
user: [
{year:'Pre 1950',name:'Chris'},
{year:'1950',name:'Joe'},
{year:'1955',name:'Jan'},
{year:'1980',name:'Bob'}
]
}
有什么建议么?
最佳答案
好了,您可以实现自己的排序标准,并将其传递给Array.sort()
。
此条件采用function(a, b)
的形式,返回一个数字:
a
应该在b
之前出现,则为负a
和b
本质上等于a
应该在b
之后这看起来似乎很随意,但请这样考虑:在将数字从小到大排序的简单情况下,该函数返回
a - b
。因此,f(a, b)
是a - b
,a - b < 0
表示a < b
。回到你的情况。让我们实现一个标准函数,将年份从小到大排序,将
Pre 1950
放在顶部:function byYear(a, b) {
if (a === "Pre 1950") return -1 // a goes before
if (b === "Pre 1950") return 1 // b goes before
return parseInt(a) - parseInt(b) // lesser goes before
})
在浏览器控制台中尝试:
> ["1980", "1970", "Pre 1950"].sort(byYear)
["Pre 1950", "1970", "1980"]
假设您要对对象进行排序,则需要调整上面的条件函数以使用
a.year
和b.year
。