Javascript使用“pre year”按年份对对象数组进行自定义排序

Javascript使用“pre year”按年份对对象数组进行自定义排序,javascript,arrays,json,sorting,Javascript,Arrays,Json,Sorting,因此,我有一个对象数组,例如: var a = {user: [ {year:'1950',name:'Joe'}, {year:'19XX',name:'Chris'}, {year:'1980',name:'Bob'}, {year:'1955',name:'Jan'} ]} 我使用这些数据来制作包含年份和名称的简单元素的模板。 我还可以选择通过一个select元素对这些数据进行排序,然后使用sorted模板按排序的顺序再次对其进行排序。鲍勃、克里斯、简、乔或一年。 但我的问题从今

因此,我有一个对象数组,例如:

var a = {user: [
 {year:'1950',name:'Joe'},
 {year:'19XX',name:'Chris'},
 {year:'1980',name:'Bob'},
 {year:'1955',name:'Jan'}
]}
我使用这些数据来制作包含年份和名称的简单元素的模板。 我还可以选择通过一个select元素对这些数据进行排序,然后使用sorted模板按排序的顺序再次对其进行排序。鲍勃、克里斯、简、乔或一年。 但我的问题从今年开始

我需要继续使用一个简单的插件jsonQ 要编辑和排序数据,需要有一个与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

此标准采用函数b的形式,返回一个数字:

如果排序列表中a应在b之前,则为负值 如果a和b基本相等,则为零 如果a应该在b之后,则为正 这可能看起来很随意,但可以这样想:在将数字从小到大排序的简单情况下,函数返回a-b。所以,fa,b是a-b,a-b<0表示a 回到你的案子上来。让我们实现一个标准函数,将年份从小到大进行排序,将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"]

考虑到要对对象进行排序,您需要调整上面的Criteria函数来处理a.year和b.year。

您可以分三步对数组进行排序

排序优先级年份,如19XX 按年份排序,无优先权 按名字排序。 var a={user:[{year:'1950',name:'Joe'},{year:'19XX',name:'Chris'},{year:'1980',name:'Bob'},{year:'1955',name:'Jan'}]}; a、 user.sort函数a、b{ 变量顺序={'19XX':-1}; 退货订单[a.year]| | 0-订单[b.year]| | 0 | | a.year-b.year | | a.name.localeCompareb.name; };
console.loga 在发布后不久,我就在使用插件时找到了解决方案。这正是我想要的,对不起,我应该详细说明

我的问题是我的选项被传递到插件的排序方法中。 不容易找到,因为文档不是100

var orderedData = dataObj.sort('year', {
  'order' : 'ASC',
  logic: function(val){
     return (val == 'pre 1950') ? '1911' : val;
  }
});

这实际上是在用1911取代“1950年以前”,只是为了排序。

您需要定义自己的比较功能。实际上,P在字典上比任何数字都大;我想你说得有道理+1.详细答案。干得好。@slezica-是的,+1这是理解这种操纵的一个很好的答案。。我被这个插件卡住了。你可以跳过这种情况下的妄想。@NinaScholz-你是对的。。旧习难改: