我已经看到问题和答案如何按一个值(文本或数字)和两个数字(年份和数量)对数组进行排序。
如何按升序排序一个字符串,按特殊顺序排序另一个字符串?
这是数组
中的一个对象var stop = {
type: "S", // values can be S, C or H. Should ordered S, C and then H.
street: "SW Dummy St." // Should be sorted in ascending order
}
预期最终结果应如下所示
var data = [
{ type: 'S', year: 'SW Karp' },
{ type: 'S', year: 'SW Walker' },
{ type: 'C', year: 'SW Greth' },
{ type: 'C', year: 'SW Main' }
{ type: 'H', year: 'SW Dummy' }
];
答案 0 :(得分:5)
Array.sort()
方法接受排序功能,允许您自己实现排序。
data.sort(function (a, b) {
// Specify the priorities of the types here. Because they're all one character
// in length, we can do simply as a string. If you start having more advanced
// types (multiple chars etc), you'll need to change this to an array.
var order = 'SCH';
var typeA = order.indexOf(a.type);
var typeB = order.indexOf(b.type);
// We only need to look at the year if the type is the same
if (typeA == typeB) {
if (a.year < b.year) {
return -1;
} else if (a.year == b.year) {
return 0;
} else {
return 1;
}
// Otherwise we inspect by type
} else {
return typeA - typeB;
}
});
Array.sort()
如果a == b
,则要求返回0,&lt; 0如果a < b
和&gt;如果a > b
,则为0。
你可以在这里看到这个; http://jsfiddle.net/32zPu/
答案 1 :(得分:2)
我赞成了Matt的答案,但是想要添加一种稍微不同的方法来获取排序顺序,该排序顺序可以用于超出单个字符的值,并且比较年份值的方式更短:
data.sort(function(a, b) {
var order = {"S": 1,"C": 2,"H": 3}, typeA, typeB;
if (a.type != b.type) {
typeA = order[a.type] || -1;
typeB = order[b.type] || -1;
return(typeA - typeB);
} else {
return(a.year.localeCompare(b.year));
}
});
答案 2 :(得分:0)
您可以将自定义函数传递给数组排序方法,该方法允许您定义项目的排序方式。这样的东西应该有效(你的未分类数据将在'data'var中):
function sortFunc (item1, item2) {
var sortOrder = 'SCH';
if (item1.type != item2.type)
{
return sortOrder.indexOf(item1.type) - sortOrder.indexOf(item2.type);
}
else
{
return item1.year.localeCompare(item2.year);
}
}
var sortedData = data.sort(sortFunc);