【问题标题】:why doesn't this code work for anagram checking?为什么这段代码不适用于字谜检查?
【发布时间】:2016-04-14 13:41:53
【问题描述】:
我正在尝试在 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");
}
}
【问题讨论】:
标签:
javascript
arrays
sorting
split
anagram
【解决方案1】:
== 不适用于Array,因为Array 是Object。 == 运算符检查 Objects 是否相同:
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");
}
}
【解决方案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");
}
}
【解决方案3】:
我正在尝试在 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;
}