如何对不同属性执行自定义 backbone 排序?
How do I execute a custom backbone sort on different attributes?
我正在尝试执行以下操作。考虑到这一点,我想对一些棒球运动员进行排序。经理应该在顶部(按活跃然后姓名排序),然后我想对球员或任何其他类型进行排序 - 可以按活跃然后姓名排序其他几种类型。
最重要的是,我对名称使用了不区分大小写的自然排序。
这是一个示例列表:
[
{type: 'manager', name: 'Michael A', active: true},
{type: 'player', name: 'Abraham B', active: true},
{type: 'player', name: 'Jason R', active: false},
{type: 'manager', name: 'John A', active: true},
{type: 'coach', name: 'Ron A', active: true},
{type: 'player', name: 'Bobby A', active: false},
{type: 'player', name: 'Bobby J', active: true}
]
对这些进行排序应该产生:
[
{type: 'manager', name: 'Michael A', active: true},
{type: 'manager', name: 'John A', active: true},
{type: 'player', name: 'Abraham B', active: true},
{type: 'player', name: 'Bobby J', active: true}
{type: 'coach', name: 'Ron A', active: true},
{type: 'player', name: 'Bobby A', active: false},
{type: 'player', name: 'Jason R', active: false},
]
我试过的一件事是 case 语句,但我不知道如何进行下一级排序(名称和活动)
comparator: function(person) {
switch (person.get('type')) {
case 'manager': return 1;
default: return 2;
}
}
通常你会使用 ||运算符指定排序顺序。但是,在您的情况下,基于条件的排序顺序不适用。您没有明确排序,而是像蛋糕一样分层排序。所以你需要修改你的排序功能。
var list = [{
type: 'manager',
name: 'Michael A',
active: true
},
{
type: 'player',
name: 'Abraham B',
active: true
},
{
type: 'player',
name: 'Jason R',
active: false
},
{
type: 'manager',
name: 'John A',
active: true
},
{
type: 'coach',
name: 'Ron A',
active: true
},
{
type: 'player',
name: 'Bobby A',
active: false
},
{
type: 'player',
name: 'Bobby J',
active: true
}
]
list.sort(function(a, b) {
return compareActive(a, b) || compareType(a, b) || compareNames(a, b);
});
function compareActive(a, b) {
if (a.active === b.active) {
return 0;
} else if (a.active === true) {
return -1;
} else {
return 1
}
};
function compareNames(a, b) {
return a.name.localeCompare(b.name);
};
function compareType(a, b) {
if (a.type === b.type) {
return 0;
} else if (b.type === 'manager') {
return 1;
} else if (a.type === 'manager') {
return -1;
} else {
return 0
}
}
console.log(list);
我正在尝试执行以下操作。考虑到这一点,我想对一些棒球运动员进行排序。经理应该在顶部(按活跃然后姓名排序),然后我想对球员或任何其他类型进行排序 - 可以按活跃然后姓名排序其他几种类型。
最重要的是,我对名称使用了不区分大小写的自然排序。
这是一个示例列表:
[
{type: 'manager', name: 'Michael A', active: true},
{type: 'player', name: 'Abraham B', active: true},
{type: 'player', name: 'Jason R', active: false},
{type: 'manager', name: 'John A', active: true},
{type: 'coach', name: 'Ron A', active: true},
{type: 'player', name: 'Bobby A', active: false},
{type: 'player', name: 'Bobby J', active: true}
]
对这些进行排序应该产生:
[
{type: 'manager', name: 'Michael A', active: true},
{type: 'manager', name: 'John A', active: true},
{type: 'player', name: 'Abraham B', active: true},
{type: 'player', name: 'Bobby J', active: true}
{type: 'coach', name: 'Ron A', active: true},
{type: 'player', name: 'Bobby A', active: false},
{type: 'player', name: 'Jason R', active: false},
]
我试过的一件事是 case 语句,但我不知道如何进行下一级排序(名称和活动)
comparator: function(person) {
switch (person.get('type')) {
case 'manager': return 1;
default: return 2;
}
}
通常你会使用 ||运算符指定排序顺序。但是,在您的情况下,基于条件的排序顺序不适用。您没有明确排序,而是像蛋糕一样分层排序。所以你需要修改你的排序功能。
var list = [{
type: 'manager',
name: 'Michael A',
active: true
},
{
type: 'player',
name: 'Abraham B',
active: true
},
{
type: 'player',
name: 'Jason R',
active: false
},
{
type: 'manager',
name: 'John A',
active: true
},
{
type: 'coach',
name: 'Ron A',
active: true
},
{
type: 'player',
name: 'Bobby A',
active: false
},
{
type: 'player',
name: 'Bobby J',
active: true
}
]
list.sort(function(a, b) {
return compareActive(a, b) || compareType(a, b) || compareNames(a, b);
});
function compareActive(a, b) {
if (a.active === b.active) {
return 0;
} else if (a.active === true) {
return -1;
} else {
return 1
}
};
function compareNames(a, b) {
return a.name.localeCompare(b.name);
};
function compareType(a, b) {
if (a.type === b.type) {
return 0;
} else if (b.type === 'manager') {
return 1;
} else if (a.type === 'manager') {
return -1;
} else {
return 0
}
}
console.log(list);