получить индексы для разделенной строки - PullRequest
4 голосов
/ 14 июля 2011

Как я могу использовать функцию str.split () , чтобы получить массив индексов совпадений вместо фактических совпадений?

например:.

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.

Еще лучше, этот вывод двумерного массива был бы идеальным:

//[[0, "The"], [4, "quick"], [10, "brown"], [16, "fox"], [20, "jumps"], [26, "over"], ...] 

Ответы [ 4 ]

3 голосов
/ 14 июля 2011

Используйте этот метод:

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
}

Пример:

alert(splitWithIndex(str,' ')) 

РЕДАКТИРОВАТЬ (17 декабря 2018 г.): избегать добавления методов к собственному объекту String.

3 голосов
/ 14 июля 2011

Если все слова уникальны, вы можете сделать это:

Пример: 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] );
}

Если есть повторяющиеся слова, это следует сделать:

Пример: 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 );
}
2 голосов
/ 14 июля 2011
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
1 голос
/ 14 июля 2011

Следующий метод представляет собой простой линейный цикл по строке.Это быстрее, чем сочетание split () и indexOf ().Кроме того, он дает полный «2D» результат (кстати, нумерация в вопросе неверна).

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"], ...]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...