Dr.Apell
Dr.Apell

Reputation: 131

Javascript find and match last item of the string

I am trying tor write this function that Check if a string (first argument, str) ends with the given target string (second argument, target). I have used this code but it seems not to work. How can i tweak it?

function confirmEnding(str, target) {
  var last = str.substring(-1);
  var last2 = target.substring(-1);
  if (last == last2) return true;
  else if (last !== last2) return false;
}

confirmEnding("Walking on water and developing software from a specification 
    are easy if both are frozen", "specification") )/*should return "false".
    confirmEnding("Bastian", "n") should return true.
    confirmEnding("Connor", "n") should return false.
    confirmEnding("Walking on water and developing software from a specification 
    are easy if both are frozen", "specification") should return false.
    confirmEnding("He has to give me a new name", "name") should return true.
    confirmEnding("Open sesame", "same") should return true.
    confirmEnding("Open sesame", "pen") should return false.
    confirmEnding("If you want to save our world, you must hurry. We dont know 
    how much longer we can withstand the nothing", "mountain") should return 
    false.
    Do not use the built-in method .endsWith() to solve the challenge.*/

Upvotes: 1

Views: 2826

Answers (10)

Don
Don

Reputation: 4202

In order to pass all of the tests with the desired return values, the function should not be comparing the last character of the string, but rather the entire string, target to the corresponding end substring of str. You need the length of target to find the correct starting index for the corresponding substring in str as follows:

function confirmEnding (str, target) {
    return str.substring(str.length - target.length) === target)
}

Your code is comparing the entire strings. See substring() documentation below. -1 is defaulting to 0 thus returning the substring starting at index 0 and returning the rest of the string (the entire string) since no end index is given. .

"If either argument is less than 0 or is NaN, it is treated as if it were 0."

You can use the length of target and subtract it from the length of str to get the correct substring for comparison. This will return all of the characters from this index to the end of the string as in str.length - target.lengththough you only really need target.length to make the comparison using negative indices.

Using substring():

function confirmEnding (str, target) {
   var last  = str.substring(str.length- target.length);
   return last === target;
 }

simplified:

function confirmEnding (str, target) {
    return str.substring(str.length - target.length) === target)
}

substring() documentation

UPDATE: substr() is now deprecated, answer updated to use substring() only.

Upvotes: 3

Michael Geary
Michael Geary

Reputation: 28880

After seeing the ongoing confusion over this case (abbreviated for readability):

confirmEnding(
    "Walking on water...both are frozen",
    "specification"
);  // Should return false (why not true?)

and also this interesting note:

/* Do not use the built-in method .endsWith() to solve the challenge. */

I have a hunch about what may have happened.

Double-check the instructions for this question. Are you sure you're supposed to test if the last character of each string is the same? It sounds like you are supposed to test if the src string ends with the entire target string.

After all, that is what the .endsWith() method does. And it explains the mystery of the test case above.

The MDN documentation for .endsWith() doesn't describe the method very well, but the examples it gives make it clear.

With that understanding, you can probably now write the code. I'm not going to write it for you, but I will drop some hints below. I added some code for your tests so that they not only log the result, but also whether they return the desired result. (In the version as written here, all the tests will fail.)

// Return true if str ends with target, false if it does not
function confirmEnding( str, target ) {
    // You can do this in a single return statement
    // with one === comparison in it. The .slice()
    // method will help you here, and you only need
    // to pass a single argument into it.
    // You don't need any if statements, intermediate
    // variables, or anything fancy.
    // There are several other ways to do it too, including
    // the approach shown on the MDN page.
}

function testEnding( str, target, desired ) {
    var result = confirmEnding( str, target );
    console.log(
        '"' + str + '"',
        '"' + target + '"',
        'returns', result,
        result === desired ? 'Good' : 'WRONG!'
    );
}

testEnding( "Bastian", "n", true );
testEnding( "Connor", "n", false );
testEnding( "Walking on water and developing software from a specification are easy if both are frozen", "specification", false );
testEnding( "He has to give me a new name", "name", true );
testEnding( "Open sesame", "same", true );
testEnding( "Open sesame", "pen", false );
testEnding( "If you want to save our world, you must hurry ); We dont know how much longer we can withstand the nothing", "mountain", false );

Upvotes: 1

Pablo Darde
Pablo Darde

Reputation: 6432

Simplest way:

const confirmEnding = (_str, _target) => _str.charAt(_str.length - 1) === _target.charAt(_target.length - 1);

https://jsfiddle.net/pablodarde/hsdgjmzw/

Upvotes: 0

Maciej Kozieja
Maciej Kozieja

Reputation: 1865

Why have to check if last words are same so:

const confirmEnding = (str, target) => new RegExp(`${target}$`, '').test(str)

console.log(confirmEnding("Walking on water and developing software from a specification are easy if both are frozen", "specification"))

console.log(confirmEnding("Bastian", "n"))
console.log(confirmEnding("Connor", "n"))
console.log(confirmEnding("Walking on water and developing software from a specification are easy if both are frozen", "specification"))
console.log(confirmEnding("He has to give me a new name", "name"))
console.log(confirmEnding("Open sesame", "same"))
console.log(confirmEnding("Open sesame", "pen"))
console.log(confirmEnding("If you want to save our world, you must hurry. We dont know how much longer we can withstand the nothing", "mountain"))

Upvotes: 0

optimistanoop
optimistanoop

Reputation: 952

You can use chatAt()

function confirmEnding (str, target) {
   var last  = str.charAt(str.length -1);
   var last2 = target.charAt(target.length -1);
   return last === last2 ;
}

Upvotes: 0

ShaneNal
ShaneNal

Reputation: 41

How about this?

function confirmEnding (str, target) {
    var last  = str.charAt(str.length-1);
    var last2 = target.charAt(target.length-1);
    return (last == last2);
}

Upvotes: 0

Egor Stambakio
Egor Stambakio

Reputation: 18156

const a = "Walking on water and developing software from a specification are easy if both are frozen", 
	b = "specification";
  
// your function
const equalLastLetter = (a, b) => a.substr(-1) === b.substr(-1);

console.log(equalLastLetter(a, b))

Upvotes: 0

Bergur
Bergur

Reputation: 4067

function confirmEnding (str, target) {
   return  str.substr(-1) == target.substr(-1);  
 }

console.log(confirmEnding("Walking on water and developing software from a specification are easy if both are frozen", "specification"));

Upvotes: 0

Aldo Sanchez
Aldo Sanchez

Reputation: 450

Your error is that you're using substring. Try str.substr instead of substring

Upvotes: 0

Pedro Rodrigues
Pedro Rodrigues

Reputation: 1688

You can use this function:

function confirmEnding(a, b) {
    var l1 = a[a.length - 1];
    var l2 = b[b.length - 1];

    return l1 === l2;
}

Upvotes: 0

Related Questions