在JavaScript中比较字符串的最佳方法?

HRJ*_*HRJ 378 javascript string optimization comparison binary-search

我正在尝试优化一个在JavaScript中对字符串进行二进制搜索的函数.

二进制搜索要求您知道密钥是==枢轴还是<枢轴.

但这需要在JavaScript中进行两次字符串比较,这与C具有strcmp()返回三个值(-1, 0, +1)(小于,等于,大于)的函数的类似语言不同.

JavaScript中是否存在这样的本机函数,它可以返回三元值,以便在二进制搜索的每次迭代中只需要进行一次比较?

Dan*_*llo 504

您可以使用该localeCompare()方法.

string_a.localeCompare(string_b);

/* Expected Returns:

 0:  exact match

-1:  string_a < string_b

 1:  string_a > string_b

 */
Run Code Online (Sandbox Code Playgroud)

进一步阅读:

  • 当您需要不区分大小写的比较时,可以使用toLowerCase或toLocaleLowerCase. (24认同)
  • 不幸的是,stringCompare不可靠.Opera,IE,Firefox,Chrome和Safari都返回1为'dog'.localeCompare('cat'),这是预期的,当你反转调用者和参数时返回-1.BUt大写字母表现得很奇怪 - 'dog'.localeCompare('Dog')在我测试的浏览器中,只有Safar 4返回1.它在IE8和firefox 3中返回-1,而Opera 9和Chrome都返回+32. (14认同)
  • 显然你最好自己比较一下; http://jsperf.com/localecompare (10认同)
  • 我认为值得注意的是,V8(Chrome)似乎在localeCompare上解释ECMA-262与IE/Firefox不同.例如:"a".localeCompare("Z")应该返回-1,而是返回7,它是"a"的字符代码 - "Z"的字符代码.不幸的是,规范中的语言是松散的,指定localeCompare()返回负数,正数或0.(不是特别是-1,1,0).我提交了一份错误报告,希望这可能会改变,但这是自2010年8月以来的一个问题,所以我对此表示怀疑. (2认同)
  • @GerbenJacobs谢谢你。我还从中得出了一个更大的基准(二进制搜索):http://jsperf.com/localecompare/2 (2认同)

Cip*_*ipi 54

在JavaScript中你可以检查两个字符串的值与整数相同,所以你可以这样做:

  • "A" < "B"
  • "A" == "B"
  • "A" > "B"

因此,您可以创建自己的函数来检查字符串的方式与strcmp().

所以这将是相同的功能:

function strcmp(a, b)
{   
    return (a<b?-1:(a>b?1:0));  
}
Run Code Online (Sandbox Code Playgroud)

  • 你的意思是"A"=="B"? (14认同)
  • 再次,阅读原始问题!! 重点是避免进行多个字符串比较. (12认同)
  • 哦对不起.没有看到......至少这适用于某人.= | (9认同)

Gum*_*mbo 13

您可以使用比较运算符来比较字符串.strcmp可以像这样定义一个函数:

function strcmp(a, b) {
    if (a.toString() < b.toString()) return -1;
    if (a.toString() > b.toString()) return 1;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

编辑     这是一个字符串比较函数,它最多需要min {length(a),length(b)}比较,以告诉两个字符串如何相互关联:

function strcmp(a, b) {
    a = a.toString(), b = b.toString();
    for (var i=0,n=Math.max(a.length, b.length); i<n && a.charAt(i) === b.charAt(i); ++i);
    if (i === n) return 0;
    return a.charAt(i) > b.charAt(i) ? -1 : 1;
}
Run Code Online (Sandbox Code Playgroud)

  • 但是这个例程确实完成了OP不想要做的事情:有两个字符串比较(更不用说那些函数调用"toString"). (10认同)
  • 不,localeCompare 不会在内部执行此操作。比较字符是通过减法来实现的,因此只要该运算的结果非零,您就知道答案。您的答案可以重新比较每个字符串的*所有*字符。 (2认同)