繁体   English   中英

比较两个数组之间的值

[英]Comparing values between two arrays

我正在尝试建立一个功能来检查单词或文本是否是回文。 为此,它将文本拆分,以使每个字母都是新数组的元素,它消除了空格并制作了反向数组。 然后,它检查两个数组中位于相同位置的每个元素是否相等。 如果不是,则返回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("rye"); 

我不知道出什么问题了,但是无论我传递给该函数什么字词或文本,该函数似乎都继续返回真值。 怎么了

您的问题似乎是因为reverse()也会更改实际数组。 这样做

var reverse = noSpace.reverse();

将反转noSpace并在变量reverse上为其分配引用。 也就是说,两个数组将是相同的(反向)数组。

为了绕过它,我使用了.slice() 创建原始数组的副本 ,然后在该新数组上调用.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("aba")); console.log(palindrome("rye")); 

您为回文编码的方式太复杂了。

但是您的代码存在一个问题:执行reverse()它也会同时更改原始数组。

因此,您需要确保通过slice()复制它。

另外,您可以直接发送布尔结果,而不是执行10

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;
}

首先,我在传递的String的每个字符之后分割数组。 之后,我得到了数组长度的一半,因为仅检查一半就足够了。 对于for循环,我将上半部分与后半部分进行比较。 一旦发现两个不匹配的字符,我将返回false。 如果整个前半部分与数组的后半部分匹配,则for循环将完成,然后返回true。

实际发生的是.reverse()反转一个数组,然后存储对该数组的引用,这不是您在check()方法中要调用的引用。

简单的解决方法是更改​​您的if语句:

if (a[i] !== b.reverse()[i])

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM