2011-03-31 14 views
39

Lo que quiero hacer es tomar una cadena como this.those.that y obtener una subcadena hacia o desde la enésima aparición de un carácter. Por lo tanto, desde el inicio de la cadena hasta la segunda aparición de . se devolverá this.those. Del mismo modo, desde la segunda aparición de . hasta el final de la cadena, se devolverá that. Lo siento si mi pregunta es nublada, no es tan fácil de explicar. Además, no sugiera hacer variables adicionales, y el resultado estará en una cadena y no en una matriz.Cortar una cadena en la n. ° aparición de un carácter

+1

Cualquier oposición a dividir en una matriz, y luego unir las porciones de las matrices de nuevo? Utiliza funciones que operan en cadenas o producen cadenas. – tvanfosson

+1

Parece que ya sabes la respuesta; dividir la cuerda en su separador y luego reformar una nueva cuerda con las partes parece ser la mejor opción. ¿Por qué limitarse a no usar una matriz? – Tejs

+1

Una cadena es una matriz. – Incognito

Respuesta

67

Podría hacerlo sin matrices, pero necesitaría más código y sería menos legible.

Generalmente, solo desea utilizar la mayor cantidad de código para realizar el trabajo, y esto también aumenta la legibilidad. Si encuentra que esta tarea se está convirtiendo en un problema de rendimiento (compárela), y luego puede decidir comenzar a refactorizar para el rendimiento.

var str = 'this.those.that', 
    delimiter = '.', 
    start = 1, 
    tokens = str.split(delimiter).slice(start), 
    result = tokens.join(delimiter); // those.that 

jsFiddle.

+1

Pensé que el resultado se suponía que era tanto "this.those" como "that"? – tvanfosson

+0

@tvanfosson Quizás malinterpreté la pregunta, pero fue aceptada :) – alex

+5

guau, esta respuesta es increíble, gracias alex! – iamserious

3

estoy perplejo en cuanto a por qué quiere hacer las cosas puramente con funciones de cadena, pero supongo que se podría hacer algo como lo siguiente:

//str  - the string 
//c   - the character or string to search for 
//n   - which occurrence 
//fromStart - if true, go from beginning to the occurrence; else go from the occurrence to the end of the string 
var cut = function (str, c, n, fromStart) { 
    var strCopy = str.slice(); //make a copy of the string 
    var index; 
    while (n > 1) { 
     index = strCopy.indexOf(c) 
     strCopy = strCopy.substring(0, index) 
     n--; 
    } 

    if (fromStart) { 
     return str.substring(0, index); 
    } else { 
     return str.substring(index+1, str.length); 
    } 
} 

Sin embargo, me gustaría firmemente partidario de algo así como la de Alex código mucho más simple.

+0

+1 por esfuerzo :) –

1

Si realmente quiere meter a métodos de cadena, entonces:

// Return a substring of s upto but not including 
// the nth occurence of c 
function getNth(s, c, n) { 
    var idx; 
    var i = 0; 
    var newS = ''; 
    do { 
    idx = s.indexOf(c); 
    newS += s.substring(0, idx); 
    s = s.substring(idx+1); 
    } while (++i < n && (newS += c)) 
    return newS; 
} 
3

Prueba esto:

"qwe.fs.xczv.xcv.xcv.x".replace(/([^\.]*\.){3}/, ''); 
"xcv.xcv.x" 

"qwe.fs.xczv.xcv.xcv.x".replace(/([^\.]*\.){**nth**}/, ''); - ¿dónde está n es la cantidad de ocurrencia de eliminar.

+0

Esta es mejor que la respuesta aceptada. A veces el delimitador podría ser una expresión regular (por ejemplo, \ s +). caso, la respuesta aceptada no funcionará. Pero t su voluntad. – killua8p

+0

@ killua8p Odd reasoning. Si * a veces el delimitador podría ser una expresión regular *, lo diseñaría como tal. Si fue para dividir en una cadena, no siempre deberías privilegiar la expresión regular porque * puedes necesitarla *. YAGNI. – alex

+0

Esta es aproximadamente 4 veces más rápido. – jazzgil

2

Por si acaso alguien necesita tanto "este" y "those.that" de una manera como Alex describió en su comment, aquí es un código modificado:

var str = 'this.those.that', 
 
    delimiter = '.', 
 
    start = 1, 
 
    tokens = str.split(delimiter), 
 
     result = [tokens.slice(0, start), tokens.slice(start)].map(function(item) { 
 
    return item.join(delimiter); 
 
    }); // [ 'this', 'those.that' ] 
 

 
document.body.innerHTML = result;

Cuestiones relacionadas