簡體   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