字符串字符迭代在javascript中的效率

时间:2017-05-14 15:04:35

标签: javascript

我的任务是编写一个字符串比较函数,其结果如下:

"ABC" & "abc" returns 0;
"abc" & "abcd" return -1;
"abcd" & "abc" returns 1;

我的解决方案是:

function strcmp(a,b){
  var aTemp = a.toLowerCase();
  var bTemp = b.toLowerCase();
  if(aTemp === bTemp){
    return 0;
  } else {
    for(var i = 0; i < aTemp.length;i++){
        var charAtA = aTemp.charCodeAt(i), charAtB = bTemp.charCodeAt(i);
      if(charAtB !== charAtB) // NaN returns false when compared to itself.
        return 1;
      if(charAtA < charAtB)
                return -1;
       else if(charAtA > charAtB)
        return 1;
    }
    if(bTemp.length > aTemp.length)
        return -1;
    return 0;
  }
}

在展示我的解决方案时(除了在代码中发现错误),我被问到为什么我将字符串转换为小写并将它们存储在参数中,而不是for循环的每次迭代,将字符转换为小写。 所以我的问题是,将字符串转换为小写字母的正确方法是什么,效率更高,或者我提交答案的人只是和我一起玩心灵游戏?

2 个答案:

答案 0 :(得分:1)

将整个字符串转换为小写意味着您必须遍历所有字符,即使比较将停在第一个字符差异处。因此,如果您在转换每个角色时进行转换,则只需执行所需的转换即可获得结果。除非这两个字符串相等,否则你总是会以较少的方式进行转换;当它们相等时,你会进行相同数量的转换。

答案 1 :(得分:0)

作为对您的问题的回答,将小写字符串保存到变量中是正确的。如果你在for循环中转换,那么在每次迭代时都会调用toLowerCase()方法调用,这是低效的。

现在,不确定你是否知道,但javascript有一个类似于strcmp的方法,称为localeCompare()。因此,代码的替代方法是:

a.toLowerCase().localeCompare(b.toLowerCase());