JS回文检查“每个”辅助方法分解

问题描述 投票:1回答:3

我试图理解为什么我的输入是falsy

> palindrome('abaasa')
false

鉴于这种回文检查功能

function palindrome(str) {
  return str.split('').every((char, i) => {
    return char === str[str.length - i - 1];
  });
}

根据我的理解,every助手对数组中的每个值进行布尔检查。

当分解时,它对我来说就像这样。

(0 => a) === (5 => a) // truthy <--- START
(1 => b) === (4 => s) // falsy
(2 => a) === (3 => a) // truthy

我知道有比实际更多的比较,我知道这需要优化。

继续迭代,这是指针相交的地方。

(3 => a) === (2 => a) // truthy
(4 => b) === (1 => s) // falsy
(5 => a) === (0 => a) // truthy <--- STOP 

every方法是否足够聪明,在发现虚假比较时返回false?

如果不是如何根据我的功能确定falsy回归?

javascript algorithm ecmascript-6 palindrome
3个回答
1
投票

您可以通过在console.log函数中引入every语句来检查它是否足够智能。这将允许您实际查看它停止的位置。

function palindrome(str) {
  return str.split('').every((char, i) => {
    console.log(i);
    return char === str[str.length - i - 1];
  });
}

let str = 'abaasa';
console.log(palindrome(str)); // prints: 0 1 false

每个方法足够智能,当它找到一个虚假的比较时返回false吗?

正如你所看到的,它足够聪明,可以在一个假的后停下来。当它总共达到5时,它只通过了0和1。


0
投票

.every()

检查每个条件是否为真(y)。如果其中任何一个被评估为false,那么它将返回false。这就是doc关于其回归的说法:

如果回调函数为每个数组元素返回一个truthy值,则返回true;否则返回false。否则,错误。


0
投票

every()函数用于对数组中的每个元素执行布尔检查。

所以如果你有:

const array = [0, 10, 14];

问题是你想知道该数组中的每个值是否大于5。

您可以编写一些看起来像这样的代码:

array.every((val) => val > 5);

我们将获取数组,在其上调用every()函数并传入一个函数来调用数组中的每个元素。所以我传入val并检查0是否大于5将返回false。

every()函数运行时,它检查每个函数运行的return值,如果任何函数返回false,那么整个表达式也返回false,但是如果它为每个元素返回true,则整个函数表达式返回true。

因此它返回数组中每个元素的比较。

请记住,通过使用every()数组助手来解决回文,您正在做两倍的工作。这是一个解决方案,但它的工作量是它需要的两倍。

所以你的原因归结为因为每个角色都不是另一方角色的镜像。

你在这说什么是:

return char === str[str.length - i - 1];

返回第一个元素和数组另一侧的镜像元素之间的比较。

[abaasa]

a === a // true
b === s // false
a === a // true

那里有一个假,所以它不是回文。

它是一个回文:

[abaaba]

a === a // true
b === b // true
a === a // true
© www.soinside.com 2019 - 2024. All rights reserved.