2012-08-09 30 views
7

que tiene una función f similar acadena concat JavaScript con retroceso

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

Ahora, quiero usar JavaScript charecter especial "\ b" de tal manera que puedo elegir si quiero mostrar la hardcoded cadena "abc" o no. Por ejemplo,

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

Intenté lo mismo, pero no funciona. En otras palabras, quiero concaturar una cadena con un carácter de retroceso para poder eliminar los últimos caracteres de la cadena.

¿Podemos hacer esto en JavaScript?

EDITAR El código real es demasiado grande (es un enorme 1 forro que concats muchas cadenas). Para mapear eso en el ejemplo anterior, no podemos editar la función f, así que haga lo que quiera desde la función externa f.

+1

Sí, podemos hacerlo. Sin embargo, no puedo "darle el código". Una forma sería analizar el 'str' pasado a la función, atrapar el' \ b's y hacer algo de manipulación de cadena. – kapa

+2

Pregunta muy interesante. Estoy ansioso por ver la respuesta. –

+2

Pasa un índice donde concat. El índice negativo cortará antes – mplungjan

Respuesta

6

El problema viene del hecho de que \b es sólo otro carácter en el código ASCII. El comportamiento especial es solo cuando se implementa mediante un lector de cadenas, por ejemplo, un terminal de texto.

Tendrá que implementar el comportamiento de retroceso usted mismo.

function RemoveBackspaces(str) 
{ 
    while (str.indexOf("\b") != -1) 
    { 
     str = str.replace(/.?\x08/, ""); // 0x08 is the ASCII code for \b 
    } 
    return str; 
} 

Ejemplo: http://jsfiddle.net/kendfrey/sELDv/

utilizar de esta manera:

var str = RemoveBackspaces(f("\b\byz")); // returns "ayz" 
+1

No es una mala idea, pero estoy descubriendo que esto no funciona bien. Por ejemplo, 'RemoveBackspaces (" abcde \ b \ b "+" yz ");' returns 'yz' – Wesley

+2

Estaba asumiendo que la expresión regular admite '\ b'. No es así Ver mi edición –

+2

fiddle muy bueno, ¿puedes explicar esa expresión regular un poco? Estoy demasiado alto para entender eso. – riship89

1

EDIT: Me di cuenta de que puede que esto no sea lo que el OP estaba buscando, pero en la mayoría de los casos es la manera más fácil de eliminar caracteres del final de una cadena.

Probablemente deberías utilizar string.substring o string.substr, que devuelven una parte de la cadena. Puedes obtener la subcadena de 0 a la longitud de cadena menos 2, luego concatenar eso con "yz" o lo que sea.

1

Interesante pregunta. Primero verifiqué algunas suposiciones sobre \ b en JS.

Si intenta esto:

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

Obtiene la misma respuesta de 'abcyz'.

Esto significa que no es una función de concatenación, sino un error fundamental en el enfoque.

Yo modificaría su enfoque para usar SubString, luego tomar el índice de \ b y cortar el carácter anterior.

1

Algo como esto:

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); 
} 

y como un bono adicional se llega a utilizar la recursividad!

nota que este es un poco más lento que hacerlo de esta manera:

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); 
} 
+1

Lanzar un error cuando intento validar. – Wesley

+1

@Wesley ver si la edición corrige que ... leí mal la pregunta –

+1

@Wesley en realidad, * ahora * reviso mi edición. Olvidó otra cosa –