Подтверждение совпадающей конечной логической проблемы (JavaScript)

Я пытаюсь создать функцию, которая возвращает, если конец строки совпадает с заданной переменной, без использования .endsWith ().

Я не уверен, почему это не работает. Объединение .join ("") и сравнение двух значений как строк работает, но не как массивы.

const confirmEnding = (str, target) => {
// split string into array, splice end of array based on target length
console.info(str.split("").splice(str.length - target.length, target.length));
// split target into array
console.info(target.split(""));
// compare two arrays
return str.split("").splice(str.length - target.length, target.length) === target.split("");

console.info(confirmEnding("Congratulation", "on"));

ВЫХОД

[ 'o', 'n' ]
[ 'o', 'n' ]
false

Ясно, что массивы точно такие же. Почему логическое значение возвращает false?

нельзя сравнивать два массива с одинаковым содержимым, но с разными ссылками на объекты. вам нужно сравнить товар.

Nina Scholz 18.03.2018 09:20

Вы должны прочитать этот вопрос stackoverflow.com/questions/7837456/… и ответы на него

Ray Toal 18.03.2018 09:21

Понятно, я не знал, что массивы нельзя сравнивать как примитивные типы данных.

Victor Evangelista 18.03.2018 09:24

Небольшая помощь: a = [1,2,3]; b = [1,2,3]; console.info(a === a); /* true */ console.info(a === b); /* false */ :-)

leaf 18.03.2018 09:47
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
4
36
2

Ответы 2

Вы можете изменить свою логику, чтобы сделать ее простой. Просто возьмите lastIndexOf строку target из str, чтобы вы могли взять подстроку последнего слова и сравнить ее с target:

const confirmEnding = (str, target) => {
  var indexOfTarget = str.lastIndexOf(target);
  var lastStr = str.substr(indexOfTarget, str.length - 1);
  if (lastStr === target){
    return true;
  }
  return false;
};
//match
console.info(confirmEnding("Congratulation", "on"));
//match
console.info(confirmEnding("Congratulation", "tion"));
//no match
console.info(confirmEnding("Congratulation", "ons"));

Вы не отвечаете на вопрос: «Почему логическое значение возвращает false?».

leaf 18.03.2018 09:37

@leaf Я понял ваш комментарий, но я предпочел предложить лучший ответ, несмотря на указание причины ответа, который не более подходит для достижения того, чего хочет достичь OP.

Ankit Agarwal 18.03.2018 09:46

Тогда ваша логика некогерентен :-P

leaf 18.03.2018 09:50

Вы не можете сравнивать два массива с одинаковым содержимым, но с разными ссылками на объекты. Вам нужно сравнить элемент, используя счетчик для символов, которые равны end итерации от конца строки.

const confirmEnding = (str, target) => {
  var i = 0;
  while (i < target.length && str[str.length - 1 - i] === target[target.length - 1 - i]) {
      i++;
  }
  return i === target.length;
}

console.info(confirmEnding("Congratulation", "on"));
console.info(confirmEnding("Congratulation", "off"));

Другие вопросы по теме