如何按唯一顺序对数组进行排序

时间:2016-10-24 20:35:03

标签: javascript

给定一个数组:

var myList = [ 'Normal', 'Urgent', 'Alert', 'Casual', 'Follow up' ];

我想输出这个列表,比如说,下拉列表。我想' 紧急'首先显示,然后是' 提醒'。其余部分应按字母顺序排序。

我知道我可以用myList.sort()按字母顺序对整个数组进行排序,但有没有办法根据我的独特要求对此列表进行排序?我希望这可以作为数组完成而不将其转换为对象并分配优先级标识符 - 但我可能错了。

此外,如果不存在紧急或警报,该怎么办?

编辑:以下是我尝试的内容:https://jsfiddle.net/reala/rqacrz0k/

4 个答案:

答案 0 :(得分:2)

最好是将优先级元素与主列表分开,如果不能保证它们存在的话。我会过滤掉这些元素,对其余元素进行排序,并将结果与​​特殊列表连接起来。

var special = ["Urgent","Alert"];
var myList = [ 'Normal', 'Urgent', 'Alert', 'Casual', 'Follow up' ];

myList = special.concat(myList.filter(function(el){ return special.indexOf(el) == -1; }).sort());
 
alert(myList);

答案 1 :(得分:2)

您可以使用对象作为排序顺序。



var array = [ 'Normal', 'Urgent', 'Alert', 'Casual', 'Follow up' ];

array.sort(function (a, b) {
    var order = { Urgent: -2, Alert: -1 };
    return (order[a] || 0) - (order[b] || 0) || a.localeCompare(b);
});

console.log(array);




答案 2 :(得分:1)

您可以使用过滤器来获取特殊值,对其余值进行排序,并连接各个部分:

var myList = [ 'Normal', 'Urgent', 'Alert', 'Casual', 'Follow up' ];

myList = myList.filter( v => v === 'Urgent' ).concat(
            myList.filter( v => v === 'Alert' ),
            myList.filter( v => !['Alert','Urgent'].includes(v) ).sort());

console.log(myList);

答案 3 :(得分:1)



var myList = [ 'Normal', 'Urgent', 'Alert', 'Casual', 'Follow up' ];

console.log(['Urgent', 'Alert', ...myList.filter(item => item !== 'Urgent' && item !== 'Alert').sort()]);