使用特定标准的Javascript数组排序

使用特定标准的Javascript数组排序,javascript,arrays,sorting,Javascript,Arrays,Sorting,假设我有一个数组,所有26个字母都是随机排列的。我知道如何使用Array.sort()函数按字母顺序排序。但是,如果我想让一个特定的字母表说“M”是列表中的第一个字母,然后按字母顺序对其余的字母表排序,我该如何排序呢 目前我所做的是从数组中拼接“M”,然后在排序后将其反移位()返回列表。这种方法行吗,还是有更干净的方法 例如: 未排序的:['b'、'c'、'd'、'm'、'a'] 排序:['m','a','b','c','d'] 这种方法行吗,还是有更干净的方法 这很好,但如果需要,可以自定义排

假设我有一个数组,所有26个字母都是随机排列的。我知道如何使用
Array.sort()
函数按字母顺序排序。但是,如果我想让一个特定的字母表说“M”是列表中的第一个字母,然后按字母顺序对其余的字母表排序,我该如何排序呢

目前我所做的是从数组中拼接“M”,然后在排序后将其反移位()返回列表。这种方法行吗,还是有更干净的方法

例如:

未排序的
['b'、'c'、'd'、'm'、'a']

排序
['m','a','b','c','d']

这种方法行吗,还是有更干净的方法

这很好,但如果需要,可以自定义排序:
Array#sort
接受一个函数,可用于确定两个条目的顺序。排序过程中,
sort
反复调用

见评论:

//创建数组
var theArray=“abcdefghijklmnopqrstuvxyz”。拆分(“”);
//分类
数组排序(函数(左、右){
//'left'和'right'是要比较的两个条目。
//如果'left'应位于'right'之前,则返回负数,
//如果出于排序目的它们相等,则为0,或为正数
//如果'right'应该在'left'之前。
//所以为了让M排在所有其他字母的前面,请确保你处理好了
//在返回值中:
如果(左==“M”){
//右边也是“M”吗?
如果(右=“M”){
//是的,相当于排序
返回0;
}
//不,左边应该是第一位
返回-1;
}
如果(右=“M”){
//右应该排在第一位(我们知道‘左’不是“M”)
返回1;
}
//默认比较
返回左。localeCompare(右);
});
//显示结果

控制台日志(数组)您可以使用order对象来设置优先级

var数组=['z','r','s','m','b','q','w','c','d','g','p','o','t','k','n','i','j','a','y','x'];
array.sort(函数(a,b){
变量顺序={m:1,m:1};
return!ORDER[a]-!ORDER[b]| a.localeCompare(b);
});

console.log(数组)除了对排序函数应用自定义比较器之外,您可以稍后移动字符

var a=['b','c','d','m','a'];
var b=a.sort();
var c=[“m”,…b.join``.replace(“m”,“”)];

控制台日志(c)如果您需要更多的案例,而不仅仅是一个字母,这里有一个可扩展的解决方案:

var alfabetPriority=“mabcdefghijklnopqrstuvwxyz”;
变量字母=['b'、'c'、'd'、'm'、'a'];
字母。排序(功能(左、右){
返回alfabetPriority.indexOf(左)-alfabetPriority.indexOf(右);
});

console.info(letters.join(“,”);//给出:m,a,b,c,d
添加一个未排序字符串和排序字符串的示例。在我看来,您当前的方法比实际实现您自己的排序算法要好。我正要添加@str所说的内容。列表中是否有多个“m”?从你描述当前流程的方式来看,你谈论的是拼接“M”,这听起来好像只有一个。(顺便说一句,“字母表”!=“字母”。)它是唯一的,所以不会有两个'M'。然而,哪封信将是优先考虑的,这是动态的。我有一个配置可以确定哪个字母应该是列表中的第一个。如果您想按顺序指定更多内容,该怎么办:
{m:1,m:1,x:2,w:3}
您可以采取类似于
(order[a.status]||0)-(order[b.status]|0)的方式具有适当的默认值零,这取决于所需的优先级。为什么要进行否决投票?我误解了什么?我的答案似乎产生了正确的输出,不是我的,但不是排序,而是重新组装。它只是更简短,更容易理解。这正是一种更“干净”的方式。有人轻快地通过并否决了除Benny之外的所有人的答案。“到目前为止,所有答案都不能很好地扩展…”通过反复按
indexOf
重新搜索字符串,上面的答案比这里的任何其他答案都更糟糕。至于硬编码的“M”:这是OP.Scale规定的解决方案,而不是performance@T.J.Crowder。对于每个需要不同优先级的字母,代码不必用
if-else
construction.ok来修改。OP问到让一件事情变得特别,所以回答这个问题是合理的(而且一点也不“没用”)。@T.J.Crowder我没有要求任何这样的事情。让我们来看看他在寻找什么答案。谢谢大家的帮助。到目前为止,我只确定1个优先权字母。我想不出一种方法来对数组中需要的内容进行排序。sort()函数本身。因此,我所能想到的就是剪接(),然后将其移入。不过,每个人的答案似乎都很好。然而,我认为我的经验还不足以判断哪一个是最好的。