我想知道我是否可以像这样排序这个数组:
[ 0 ,3, 1, 4, 0 ] => [ 1, 3, 4, 0, 0]
详细规则:
一开始,我使用了js的原始排序功能,例如:
[0, 3, 1, 4, 0].sort(function(previous_value, former_value){
if(previous_value == 0 && former_value != 0 ) {
return 1;
}else if (former_value == 0 && former_value != 0) {
return -1;
}else if (former_value == 0 && former_value == 0) {
return 0;
}else{
return previous_value - former_value;
}
})
然而,我失败了。我想知道是否可以实现"我的排序算法"使用sort
函数? e.g:
[0, 3, 1, 4, 0].sort(function(previous_value, former_value){
//code goes here
})
它会得到正确答案:
[1, 3, 4, 0, 0]
答案 0 :(得分:3)
将0
置于更高优先级
console.log(
[0, 3, 1, 4, 0].sort(function(a, b) {
return a === b ? 0 : (a === 0 ? 1 : (b === 0 ? -1 : a - b));
})
);
扩展if条件
console.log(
[0, 3, 1, 4, 0].sort(function(a, b) {
if (a === b)
return 0;
if (a === 0)
return 1;
if (b === 0)
return -1;
return a - b;
})
);
答案 1 :(得分:2)
您只需强制比较器将0视为最高数字。
protected void btn4getPwd_Click(object sender, EventArgs e)
{
if (txtusername.Text.Trim() != "")
{
em.username = txtusername.Text.Trim();
DataTable forget = em.getdetailss(10);
string passwd = (forget.Rows[0]["PassCode"].ToString());
try
{
string Subject = "Your NLS Password";
string Body = passwd;
string ToEmail = txtusername.Text.Trim();
string SMTPUser = "mymail@gmail.com", SMTPPassword = "pswd";
MailMessage mail = new MailMessage();
mail.From = new MailAddress(SMTPUser, "AspnetO");
mail.To.Add(ToEmail);
mail.Body = Body;
mail.IsBodyHtml = true;
mail.Priority = MailPriority.Normal;
SmtpClient smtp = new SmtpClient();
smtp.Host = "smtp.gmail.com";
smtp.Port = 25;
smtp.Credentials = new System.Net.NetworkCredential(SMTPUser, SMTPPassword);
smtp.EnableSsl = true;
smtp.Send(mail);
Response.Write("<script language=javascript>alert('Mail send...!! ')</script>");
}
catch (SmtpException ex)
{
lbl4get.Text = "SmtpException ";
}
catch (Exception ex)
{
lbl4get.Text = "Exception";
}
}
else { Response.Write("<script language=javascript>alert('Invalid USERNAME...!! ')</script>"); }
}
现在你只做function compareNumbers(a, b) {
if (a === 0) {
return 1;
}
if (b === 0) {
return -1;
}
return a - b;
}
。
只是因为它被标记为algorithms标记,我想说如果你希望你的数组很大并且有大量的零,那么创建一个非零元素的较小数组可能是有意义的,排序它并用原始长度附加零。
答案 2 :(得分:1)
虽然您已经有了解决方案,但可以使用logical OR运算符作为假值(如0
)并为其指定默认值(如Infinity
)。
这会将零移到最后,因为默认值大于所有其他值。
var array = [ 0 ,3, 1, 4, 0 ];
array.sort(function (a,b) {
return (a || Infinity) - (b || Infinity);
});
console.log(array);
&#13;
答案 3 :(得分:1)
这将是我的逻辑短路解决方案
var a = [0, 3, 1, 4, 0].sort((a,b) => !a && 1 || !b && -1 || a-b);
console.log(a);
&#13;