比较两个数组之间的值

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() 复制它。

您也可以直接发送布尔结果而不是执行 10.