为什么这段代码不能用于anagram检查?

时间:2016-01-10 02:24:13

标签: javascript arrays sorting split anagram

我正在尝试在javascript中进行字谜检查。为简单起见,假设下面的函数只采用小写字符串而没有任何间距/数字/符号。为什么下面的代码不起作用?

var anagram = function(string1, string2) {
    var string1array = string1.split('').sort();
    var string2array = string2.split('').sort();
    if (string1array == string2array) {
        console.log("they're anagrams");
    }
    else {
        console.log("they are not anagrams");
    }
}

3 个答案:

答案 0 :(得分:5)

==不适用于Array,因为ArrayObject==运算符检查Object是否为SAME:



var foo = {};
var bar = {};
console.log(foo == bar); // false
var foo2 = {};
var bar2 = foo2;
console.log(foo2 == bar2); // true




因此,最简单的是检查这是将它们转换回String并使用==,因为== >使用String



var anagram = function(string1, string2) {
    var string1array = string1.split('').sort();
    var string2array = string2.split('').sort();
    // All I used was .join('') on both.
    if (string1array.join('') == string2array.join('')) {
        console.log("they're anagrams");
    }
    else {
        console.log("they are not anagrams");
    }
}




答案 1 :(得分:2)

您无法像Javascript中那样直接比较数组元素。

以下是多个实现:How to check if two arrays are equal with JavaScript?

在您的情况下,您只需使用.join()来比较两个字符串:

var anagram = function(string1, string2) {
    var string1_sorted = string1.split('').sort().join('');
    var string2_sorted = string2.split('').sort().join('');
    if (string1_sorted == string2_sorted) {
        console.log("they're anagrams");
    }
    else {
        console.log("they are not anagrams");
    }
}

答案 2 :(得分:0)

  

我试图在javascript中进行字谜检查。

这不完全是对这个问题的答案,而是针对这个问题的另一种方法;在我的第一次测试中,速度更快(33-50%) Mr_Pouet和Andrew Templeton已经给了你这个确切问题的答案。

function anagram(a, b, caseSensitive){
    if(a.length !== b.length) return false;
    var c = caseSensitive? a: a.toLowerCase(), 
        d = caseSensitive? b: b.toLowerCase(),
        map = new Array(128),
        cc;

    for(var i = a.length; i--; ){
        cc = c.charCodeAt(i);
        map[cc] = (map[cc] || 0) + 1;

        cc = d.charCodeAt(i);
        map[cc] = (map[cc] || 0) - 1;
    }

    var i = map.length;
    if(i < 256){
        //faster for ANSI-like text
        while(i--) 
            if(i in map && map[i]) return false;
    }else{
        //faster for a huge sparse map, 
        //like UTF8 multibytes (Asian characters for example)
        for(var k in map)
            if(map[k]) return false;
    }
    return true;
}