Проверка палиндрома JS с разбивкой метода «каждый» - PullRequest
0 голосов
/ 09 февраля 2019

Я пытаюсь понять, почему мой ввод 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 с учетом моей функции?

Ответы [ 3 ]

0 голосов
/ 09 февраля 2019

Вы можете проверить, достаточно ли он умен, введя оператор 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

Достаточно ли умен каждый метод, чтобы возвращать ложь, когда обнаруживает ложное сравнение?

Как видите, это достаточно умен, чтобы остановиться после фальсификации.Он прошел через индексы 0 и 1 только тогда, когда мог достичь 5 в общей сложности.

0 голосов
/ 29 марта 2019

Функция 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
0 голосов
/ 09 февраля 2019

.every ()

проверяет, выполняется ли каждое условие (y).Если какой-либо из них оценивается как ложный, он вернет ложный.Вот что doc говорит о своем возвращении:

true, если функция обратного вызова возвращает истинное значение для каждого элемента массива;в противном случае - ложь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...