我试图设置一个检查单词或文本是否为回文的函数。要做到这一点,它会分割文本,使每个字母都是新数组的元素,它取消了空白区域,然后生成反向数组。 然后它检查在相同位置的两个数组的每个元素是否相等。如果不是,则返回false,如果是,则返回true。 这里的功能是:
function palindrome(str) {
var low = str.toLowerCase();
var newArray = low.split("");
var noSpace = newArray.filter(function(val) {
return val !== " ";
});
var reverse = noSpace.reverse();
function check (a, b) {
console.log(`checking '${a}' against '${b}'`);
var partial;
var result = 1;
for (var i = 0; i < a.length; i++) {
console.log(`comparing '${a[i]}' and '${b[i]}'`);
if (a[i] !== b[i]) {
result = 0;
} else {
partial = 1;
result *= partial;
}
}
return result;
}
var result = check(noSpace, reverse);
if (result == 1) {
return true;
} else {
return false;
}
}
palindrome("r y e");
&#13;
我不知道什么是错的,但似乎无论我传递给函数的单词或文本,函数都会继续返回真值。这有什么问题?
答案 0 :(得分:3)
您的问题似乎是因为reverse()
也会更改实际数组。这样做
ALLUSERS
将反转var reverse = noSpace.reverse();
并在变量noSpace
上为其指定引用。也就是说,两个阵列都是相同的(反向)阵列。
为了绕过这一点,我已经使用原始数组的reverse
到create a copy,然后在该新数组上调用.slice()
,以消除任何冲突。
这是一个看起来像的工作片段:
.reverse()
&#13;
答案 1 :(得分:1)
你为回文编码的方式太复杂了。
但是您的代码存在一个问题:当您执行reverse()
时,它也会更改原始数组。
因此,您需要确保通过slice()
复制它。
您也可以直接发送布尔结果,而不是1
和0
。
答案 2 :(得分:0)
在result *= partial;
,1 * 1
将始终等于1
答案 3 :(得分:0)
我没有更正您的代码,但这里有一个优化的解决方案。
function palindrom(string) {
var arr = string.split("");
var lengthToCheck = Math.floor(arr.length / 2);
for (var i = 0; i < lengthToCheck; i++) {
if (arr[i] != arr[arr.length - (1 + i)]) {
return false;
}
}
return true;
}
首先,我在传递的String的每个字符之后拆分数组。之后我得到阵列长度的一半,因为它足以检查一半。 使用for-loop,我将上半部分与下半部分进行比较。一旦我发现两个不匹配的字符,我就会返回false。如果整个前半部分与数组的后半部分匹配,则for循环将完成,之后将返回true。
答案 4 :(得分:0)
实际发生的是.reverse()
反转数组,然后存储对该数组的引用,而不是您在check()
方法中调用的数据。
简单修复就是更改你的if语句:
if (a[i] !== b.reverse()[i])