'JavaScript concat string with backspace

I have a function f similar to

function f(str){
    alert("abc"+str);
}

Now, I want to use JavaScript special charecter "\b" in such a way that I can choose if I want to display the hardcoded string "abc" or not. For example,

f("\b\b"+"yz"); //should output "ayz"

I tried the same, but it does not work. In other words, I want to concat a string with a backspace character so that I can remove last characters from the string.

Can we do this in JavaScript?

EDIT The real code is too much big (its a HUGE 1 liner that concats many many strings). To map that in above example, we cannot edit the function f, so do whatever you want from outside function f.



Solution 1:[1]

EDIT: I realized this may not be what the OP was looking for, but it is definitely the easier way to remove characters from the end of a string in most cases.

You should probably just use string.substring or string.substr, both of which return some portion of string. You can get the substring from 0 to the string's length minus 2, then concatenate that with "yz" or whatever.

Solution 2:[2]

Interesting question. I first checked some assumptions about \b in JS.

If you try this:

console.log('abc\b\byz');

You get the same answer of 'abcyz'.

This means, it is not a function of concatentation, but a fundamental error in the approach.

I would modify your approach to use SubString, then to take the index of \b and slice out the previous character.

Solution 3:[3]

Something like this:

function f(str, abc){
   if(!abc) abc = "abc";
   if (str.indexOf("\b") != "undefined")
   {
       abc = abc.slice(0,-1);
       str = str.replace("\b","");
       f(str, abc);
   }
   else alert(abc+str);
}

and as an added bonus you get to use recursion!

note that this is a little slower than doing it this way:

function f(str){
    var count = 0;
    var abc = "abc";
    for(var i = 0; i < str.length; i++)
    { 
       if(str[i] = "\b") //at least i think its treated as one character...
       count++;
    }
    abc = abc.slice(0, count * -1);
    alert(abc+str);
}

Solution 4:[4]

I'm processing the backspace \b, but it always has the ANSI erase in line \x1B[K after the \bs. So what I do is this:

function applyBackspaces(str) {
  // Catch character + \b or character + \b\x1B[K and delete it
  const re = /.?[\u0008](\u001b\[K)?/
  while (re.test(str)) {    
    str = str.replace(re, "");
  }
  return str;
}

// wrote "up", backspace+erase, backspace+erase (used backspace key)
// wrote "ls", backspace+backspace+erase (used clear line command C-u)
// wrote uptime
applyBackspaces('up\b\x1B[K\b\x1B[Kls\b\b\x1B[Kuptime') // uptime

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 DGH
Solution 2 Wesley
Solution 3
Solution 4 Artur Carvalho