比较两个数组之间的值
Comparing values between two arrays
我正在尝试设置一个函数来检查单词或文本是否为回文。为此,它拆分文本,使每个字母都是新数组的一个元素,去掉空格并生成反向数组。
然后它检查两个数组中相同位置的每个元素是否相等。如果不是,则 returns 假,如果是,则 returns 真。
这里的函数:
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");
我不知道出了什么问题,但似乎无论我向函数传递什么单词或文本,函数都会继续返回一个真值。这有什么问题?
在 result *= partial;
处,1 * 1
将始终等于 1
我没有更正您的代码,但这是为您优化的解决方案。
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;
}
首先,我在传递的字符串的每个字符之后拆分数组。之后我得到数组长度的一半,因为它足以检查一半。
通过 for 循环,我比较了前半部分和后半部分。一旦我发现两个不匹配的字符,我就 return false。如果整个前半部分与数组的后半部分相匹配,则 for 循环将完成,然后 true 将被 returned。
您的问题似乎是因为 reverse()
也更改了实际数组。这样做
var reverse = noSpace.reverse();
将反转 noSpace
并在变量 reverse
上分配对它的引用。也就是说,两个数组将是相同的(反向)数组。
为了绕过它,我使用了原始数组的 .slice()
到 create a copy,然后在那个新数组上调用了 .reverse()
,消除了任何冲突。
这是它的工作片段:
function palindrome(str) {
var str_array = str.toLowerCase().split("");
var no_space = str_array.filter(function(val) {
return val !== " ";
});
// By applying '.slice()', we create a new array
// reference which can then be reversed and assigned
// to the 'reverse' variable
var reverse = no_space.slice().reverse();
function check(a, b) {
var partial;
var result = 1;
for(var i=0; i < a.length; i++) {
if(a[i] !== b[i]) {
// We don't need to keep
// comparing the two, it
// already failed
return 0;
} else {
// I've kept this part even though
// I don't really know what it is
// intended for
partial = 1;
result *= partial;
}
}
return result;
}
return check(no_space, reverse) === 1;
}
console.log(palindrome("a b a"));
console.log(palindrome("r y e"));
实际发生的事情是 .reverse()
原地反转数组,然后存储对该数组的引用,这不是您在 check()
方法中调用的内容。
简单的解决方法是更改您的 if 语句:
if (a[i] !== b.reverse()[i])
你为回文编码的方式太复杂了。
但是您的代码存在一个问题:当您执行 reverse()
时,它也会更改原始数组。
因此您需要确保通过 slice()
复制它。
您也可以直接发送布尔结果而不是执行 1
和 0
.
我正在尝试设置一个函数来检查单词或文本是否为回文。为此,它拆分文本,使每个字母都是新数组的一个元素,去掉空格并生成反向数组。 然后它检查两个数组中相同位置的每个元素是否相等。如果不是,则 returns 假,如果是,则 returns 真。 这里的函数:
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");
我不知道出了什么问题,但似乎无论我向函数传递什么单词或文本,函数都会继续返回一个真值。这有什么问题?
在 result *= partial;
处,1 * 1
将始终等于 1
我没有更正您的代码,但这是为您优化的解决方案。
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;
}
首先,我在传递的字符串的每个字符之后拆分数组。之后我得到数组长度的一半,因为它足以检查一半。 通过 for 循环,我比较了前半部分和后半部分。一旦我发现两个不匹配的字符,我就 return false。如果整个前半部分与数组的后半部分相匹配,则 for 循环将完成,然后 true 将被 returned。
您的问题似乎是因为 reverse()
也更改了实际数组。这样做
var reverse = noSpace.reverse();
将反转 noSpace
并在变量 reverse
上分配对它的引用。也就是说,两个数组将是相同的(反向)数组。
为了绕过它,我使用了原始数组的 .slice()
到 create a copy,然后在那个新数组上调用了 .reverse()
,消除了任何冲突。
这是它的工作片段:
function palindrome(str) {
var str_array = str.toLowerCase().split("");
var no_space = str_array.filter(function(val) {
return val !== " ";
});
// By applying '.slice()', we create a new array
// reference which can then be reversed and assigned
// to the 'reverse' variable
var reverse = no_space.slice().reverse();
function check(a, b) {
var partial;
var result = 1;
for(var i=0; i < a.length; i++) {
if(a[i] !== b[i]) {
// We don't need to keep
// comparing the two, it
// already failed
return 0;
} else {
// I've kept this part even though
// I don't really know what it is
// intended for
partial = 1;
result *= partial;
}
}
return result;
}
return check(no_space, reverse) === 1;
}
console.log(palindrome("a b a"));
console.log(palindrome("r y e"));
实际发生的事情是 .reverse()
原地反转数组,然后存储对该数组的引用,这不是您在 check()
方法中调用的内容。
简单的解决方法是更改您的 if 语句:
if (a[i] !== b.reverse()[i])
你为回文编码的方式太复杂了。
但是您的代码存在一个问题:当您执行 reverse()
时,它也会更改原始数组。
因此您需要确保通过 slice()
复制它。
您也可以直接发送布尔结果而不是执行 1
和 0
.