¿Cómo puedo usar la función str.split () para obtener una matriz de índices de coincide en lugar de las coincidencias reales?

E.g.:

var str = "The quick brown fox jumps over the lazy dog."
console.log(str.split(' '));
//["The", "quick", "brown", "fox", "jumps", "over", "the", "lazy", "dog."] 

//I want to get this output instead for the index positions of the matches
//[0, 4, 10, 16, 20, 26, ...] 

//01234567890123456789012345678901234567890123456789 
//The quick brown fox jumps over the lazy dog.

Aún mejor aún, esta salida de matriz 2D sería ideal:

//[[0, "The"], [4, "quick"], [10, "brown"], [16, "fox"], [20, "jumps"], [26, "over"], ...] 
5
fortuneRice 14 jul. 2011 a las 03:27

4 respuestas

La mejor respuesta

Usa este método:

function splitWithIndex(str, delim){
 var ret=[]
 var splits=str.split(delim)
 var index=0
 for(var i=0;i<splits.length;i++){
  ret.push([index,splits[i]])
  index+=splits[i].length+delim.length
 }
 return ret
}

Ejemplo:

alert(splitWithIndex(str,' ')) 

EDITAR (17 de diciembre de 2018): evite agregar métodos al objeto String nativo.

3
Peter O. 17 dic. 2018 a las 09:59
function wordIndexes(s){
    var A= [], rx=  /([a-zA-Z']+)/g, M;
    while((M= rx.exec(s))!= null){
        A.push([M.index, M[1]]);
    }
    return A;
}


var string= 'The quick brown fox jumps over the lazy dog.';
wordIndexes(string).join('\n');
// returned value:
0, The
4, quick
10, brown
16, fox
20, jumps
26, over
31, the
35, lazy
40, dog
3
kennebec 14 jul. 2011 a las 01:02

Si todas las palabras son únicas, puede hacer esto:

Ejemplo: http://jsfiddle.net/rWJ5x/

var str = "The quick brown fox jumps over the lazy dog.";

var arr = str.split(' ');

for( var i = 0, len = arr.length; i < len; i++ ) {
    arr[i] = str.indexOf( arr[i] );
}

Si hay palabras que se repiten, esto debería hacerlo:

Ejemplo: http://jsfiddle.net/rWJ5x/2/

var str = "The quick brown fox jumps over the lazy brown dog.";
var pos = 0;

var arr = str.split(' ');

for( var i = 0, len = arr.length; i < len; i++ ) {
    var idx = str.indexOf( arr[i] );
    arr[i] = pos = (pos + idx);
    str = str.slice( idx );
}
3
user113716 13 jul. 2011 a las 23:39

El siguiente método es un simple barrido lineal sobre la cadena. Es más rápido que la combinación de split () e indexOf (). Además, produce el resultado completo "2D" (por cierto, la numeración en la pregunta no es correcta).

function wordIndexes(str) {
    var result = [];
    var len = str.length;
    var i = 0, j, word;
    while (i < len) {
        if (str[i] === ' ') {
            ++i;
        }
        else {
            word = "";
            for (j = i; j < len && str[j] !== ' '; ++j) {
                word += str[j];
            }
            result.push([i, word]);
            i = j;
        }
    }
    return result;
}

var str = "The quick brown fox jumps over the lazy dog.";
//         01234567890123456789012345678901234567890123456789 
var result = wordIndexes(str);
// => result = [[0, "The"], [4, "quick"], [10, "brown"], [16, "fox"], ...]
1
Jiri Kriz 14 jul. 2011 a las 01:26