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-你是对的。。旧习难改: