[英]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()
復制它。
另外,您可以直接發送布爾結果,而不是執行1
和0
。
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.