我的代码:
function palindrome(str) {
return str.split('').every((char, i) => {
return char === str[str.length - i - 1] ? true : false;
})
}
palindrome('abcba');
在使用调试器和console.log时,我得到了为什么在比较语句中写- i
,因为这样可以使我们到达对面的正确索引,但是从一开始就怎么知道这样做呢?
是否有某种说明或某种形式的图来说明- i
如何或为什么使您到达对面字符的索引?只是发现很难正确包裹我的包裹。
尽管我想这很难解释,但任何帮助都值得赞赏。
好,让我们分解一下。
str.split('')
此行将您的'abcba'
字符串分成一个数组。结果将是:
['a', 'b', 'c', 'b', 'a']
现在您有了一个可以循环遍历并从该数组中选择某些索引的数组。这在回文的情况下非常有用。
因为您想知道单词在镜像时是否相同。您可以从数组的开头和结尾开始计算。
数组中的第一项是索引0 [0]
,最后一项是索引,具体取决于数组。但是,如果您有数组并减去[array.length - 1]
,则在单词abcba中将其减去[5 - 1]
,最后得到数组中的最后一项,索引为4 [4]
。
// First iteration.
// First and last items in array.
// [0] and [array.length - 1] or [4].
↓ ↓
['a', 'b', 'c', 'b', 'a']
因此,在循环中,您在数组中从左到右移动。并将第一个值与最后一个值进行比较。您的示例使用every
方法,如果循环中的every条件返回true,则最后返回true;否则,则返回false。
循环还会公开当前索引值。在您称为every
的示例中,index的缩写。如果比较完第一个和最后一个值,则要移至数组中的下一项以开始比较第二个和第一个至最后一个值。这就是公式的来源。
i
在第一次迭代中,str.split('').every((char, i) => {
return char === str[str.length - i - 1] ? true : false;
});
的值为0。因此您具有公式:i
。这给您最后一个项目。
在第二次迭代中,length of the array, subtract 0 and subtract 1
现在为1。这意味着我们在数组的第二项中。如果再次将i
应用于公式,则可以从数组末尾开始倒数:i
。总计为length of the array, subtract 1 and subtract 1
。
-2
并且在下一次迭代中会出现重叠,但在单词为偶数的情况下不会重叠。但是这里他们都在检查// Second iteration.
// Second and first to last item in array.
// [1] and [array.length - 2] or [3].
↓ ↓
['a', 'b', 'c', 'b', 'a']
是否匹配c
。
c
并且继续进行直到到达数组中的最后一项,循环继续向上计数,并且公式向下计数。
我希望这是有道理的,并且可以帮助您更多地理解它。