所以我有一个对象数组,例如:

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之前出现,则为负
  • 如果ab本质上等于
  • ,则零
  • ,如果a应该在b之后

  • 这看起来似乎很随意,但请这样考虑:在将数字从小到大排序的简单情况下,该函数返回a - b。因此,f(a, b)a - ba - 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.yearb.year

    10-07 16:22
    查看更多