Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 按升序对不同行上的名称进行排序和显示_Javascript_Sorting - Fatal编程技术网

Javascript 按升序对不同行上的名称进行排序和显示

Javascript 按升序对不同行上的名称进行排序和显示,javascript,sorting,Javascript,Sorting,我的教授希望我们编写一个JavaScript代码,提示用户输入3个名称(一次一个)。该计划应该 按升序对不同行上的名称进行排序和显示 这就是我目前所拥有的 <html> <head> <title>Day 2 - Example 2</title> </head> <body> <center> <script language="javascript"> var na1,na2,na3;

我的教授希望我们编写一个JavaScript代码,提示用户输入3个名称(一次一个)。该计划应该 按升序对不同行上的名称进行排序和显示

这就是我目前所拥有的

<html>
<head>
  <title>Day 2 - Example 2</title>
</head>
<body>
<center>
 <script language="javascript">
   var na1,na2,na3;
   na1=prompt("Enter your first name:","");
   na2=prompt("Enter your second name:","");
   na3=prompt("Enter your third name","");  
 </script>
 </center>
</body>
</html>

第2天-示例2
变种na1,na2,na3;
na1=提示(“输入您的名字:”,”);
na2=提示(“输入您的第二个名字:”,“”);
na3=提示(“输入您的第三个名字”);

您可以将用户输入的名称存储到数组中,然后使用:

函数名称排序(){
变量名称=[];
var name1=提示(“请输入第一个名称”);
名称[0]=name1;
var name2=提示(“请输入第二个名称”);
名称[1]=名称2;
var name3=提示(“请输入第二个名称”);
名称[2]=名称3;
name.sort();
document.getElementById(“firstName”).innerHTML=names[0];
document.getElementById(“secondName”).innerHTML=names[1];
document.getElementById(“lastName”).innerHTML=names[2];
}

单击按钮可输入3个名称(一次一个)。程序将按升序对不同行上的名称进行排序和显示

输入姓名


我想你的教授希望你在这个过程中学到一些东西,所以我试着向你解释如何解决这个问题。请随时提出任何后续问题

所以,你有三个名字,在三个不同的变量中

您有两个主要问题:比较名称,以及根据比较结果对名称进行排序

让我们一步一步走

比较两个名字意味着什么?或者,在另一个世界,一个名字在另一个名字之前意味着什么

为了简单起见,让我们假设插入的名称只包含从a到z的字符,无论是小写还是大写。没有数字,没有特殊字符(如è)或其他任何东西(您最终可以尝试扩展代码以处理其他字符)

因此,为了比较这两个名称,我们创建了一个函数,该函数将两个名称作为参数,如果第一个名称位于第二个名称之前,则返回
-1
,如果它们相等,则返回
0
,否则返回
1

函数将类似于以下内容:

function compare(name1, name2) {
    // Do same magic stuff
    return -1;
}
首先,我们可以比较名字的第一个字母,并检查哪一个先到。 从字符串中提取字符的最佳方法是使用函数。您也可以将字符串作为数组访问,但它在IE7上不起作用,从学术角度来看是错误的

但在现实世界中,写
name[1]
与写
name.charAt(1)

肯定更好

但是这个代码的另一个问题是,如果有人用大写字母插入她的名字,她将总是在只使用小写字母插入名字的人之前

因此,在我们的例子中,
alice
将位于
Bob
之后

我们需要比较相同的字符,因此我们将只比较小写字符。要将名称转换为所有小写字母,我们使用函数

但若一个名字是另一个名字的子字符串(即Ali和Alice),该怎么办

for循环将结束,因此我们需要另一个条件。 让我们先说一个较短的名字

if (name1.lenght < name2.length) return -1;
return 1;
现在,你当然不会在现实世界中使用这样的解决方案。 首先,因为我漏掉了很多角落案例(当函数compare返回0时也被忽略)

其次,主要是因为您没有利用Javascript本机函数

@shash679的答案向您展示了解决方案的真实实现

但无论如何,我希望你喜欢这个解释,主要是你现在很好奇,想了解更多关于Javascript和计算机科学的知识

写代码不是写代码,更多的是解决谜题,而且很有趣


祝你的课程好运

Java对于JavaScript就像汽车对于地毯一样重要。他们没有关系。也,
function compare(name1, name2) {
    if (name1 === name2) return 0;

    if (name1.charAt(0) < name2.charAt(0)) return -1;
    if (name1.charAt(0) > name2.charAt(0)) return 1; 
}
function compare(name1, name2) {
    name1 = name1.toLowerCase();
    name2 = name2.toLowerCase();

    if (name1 === name2) return 0;

    if (name1.charAt(0) < name2.charAt(0)) return -1;
    if (name1.charAt(0) > name2.charAt(0)) return 1; 
}
for (var i = 0; i < lengthOfShorterName; i++) {
    if (name1.charAt(i) > name2.charAt(i)) return 1;
    if (name1.charAt(i) < name2.charAt(i)) return -1;
}
if (name1.lenght < name2.length) return -1;
return 1;
function compare(name1, name2) {
    name1 = name1.toLowerCase();
    name2 = name2.toLowerCase();

    if (name1 === name2) return 0;

    var lengthOfShorterName = Math.min(name1.length, name2.length)

    for (var i = 0; i < lengthOfShorterName; i++) {
        if (name1.charAt(i) > name2.charAt(i)) return 1;
        if (name1.charAt(i) < name2.charAt(i)) return -1;
    }

    if (name1.lenght < name2.length) return -1;
    return 1;
}
var na1_na2 = compare(na1, na2);
var na1_na3 = compare(na1, na3);
var na2_na3 = compare(na2, na3);

// We create the place where we will save the names
var first, second, third;

if (na1_na2 === -1) {
    // na1 comes before na2! Will it come also before na3?
    if (na1_na3 === -1) {
        // Yes! So na1 is the first!
        first = na1;

        // But who is second?
        if (na2_na3 === -1) {
            // na2 is second!
            second = na2;
            third = na3;
        } else {
            // na3 is second!
            second = na3;
            third = na2;
        }
    } else {
        // na3 is before na1, therefore is first!
        first = na3
        second = na1;
        third = na2;
    }
} else {
    // na2 is before na1. What do we need to compare?
}