Я пытаюсь создать функцию, которая возвращает, если конец строки совпадает с заданной переменной, без использования .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?
Вы должны прочитать этот вопрос stackoverflow.com/questions/7837456/… и ответы на него
Понятно, я не знал, что массивы нельзя сравнивать как примитивные типы данных.
Небольшая помощь: a = [1,2,3]; b = [1,2,3]; console.info(a === a); /* true */ console.info(a === b); /* false */ :-)



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вы можете изменить свою логику, чтобы сделать ее простой. Просто возьмите 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 Я понял ваш комментарий, но я предпочел предложить лучший ответ, несмотря на указание причины ответа, который не более подходит для достижения того, чего хочет достичь OP.
Тогда ваша логика некогерентен :-P
Вы не можете сравнивать два массива с одинаковым содержимым, но с разными ссылками на объекты. Вам нужно сравнить элемент, используя счетчик для символов, которые равны 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"));
нельзя сравнивать два массива с одинаковым содержимым, но с разными ссылками на объекты. вам нужно сравнить товар.