比较两个数组之间的值

时间:2017-08-18 16:47:01

标签: javascript arrays palindrome

我试图设置一个检查单词或文本是否为回文的函数。要做到这一点,它会分割文本,使每个字母都是新数组的元素,它取消了空白区域,然后生成反向数组。 然后它检查在相同位置的两个数组的每个元素是否相等。如果不是,则返回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("r y e");
&#13;
&#13;
&#13;

我不知道什么是错的,但似乎无论我传递给函数的单词或文本,函数都会继续返回真值。这有什么问题?

5 个答案:

答案 0 :(得分:3)

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

ALLUSERS

将反转var reverse = noSpace.reverse(); 并在变量noSpace上为其指定引用。也就是说,两个阵列都是相同的(反向)阵列。

为了绕过这一点,我已经使用原始数组的reversecreate a copy,然后在该新数组上调用.slice(),以消除任何冲突。

这是一个看起来像的工作片段:

&#13;
&#13;
.reverse()
&#13;
&#13;
&#13;

答案 1 :(得分:1)

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

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

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

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

答案 2 :(得分:0)

result *= partial;1 * 1将始终等于1

答案 3 :(得分:0)

我没有更正您的代码,但这里有一个优化的解决方案。

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-loop,我将上半部分与下半部分进行比较。一旦我发现两个不匹配的字符,我就会返回false。如果整个前半部分与数组的后半部分匹配,则for循环将完成,之后将返回true。

答案 4 :(得分:0)

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

简单修复就是更改你的if语句:

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