#javascript #arrays
#javascript #массивы
Вопрос:
Я пытаюсь получить фрагмент массива строк от первого элемента, который содержит эти буквы в данном случае, до последнего элемента, содержащего эти буквы в этом случае.
Сначала вводится предложение, поэтому я разделяю его пробелами. Затем я пытаюсь получить фрагмент из indexOf(‘IN’) до lastIndexOf(‘NN’), но получаю пустой массив.
Вот что я попробовал:
var str = "weather(NN) in(IN) boston(NN)"
str.split(' ').slice(str.split(' ').indexOf('IN'), str.split(' ').lastIndexOf('NN') 1);
Как я могу получить его так, чтобы я получал ["in(IN)", "boston(NN)"]
или, если строка «погода (NN) в (В) Бостоне (NN), штат Массачусетс (NN)», я получаю ["in(IN)", "boston(NN)", "massachusetts(NN)"]
?
Ответ №1:
Методы indexOf
and lastIndexOf
не ищут подстроки в элементах массива, они ищут только совпадения полного элемента.
Вы можете использовать методы reduce
и reduceRight
для поиска массива:
var str = "weather(NN) in(IN) boston(NN)";
var arr = str.split(' ');
var first = arr.reduce(function(p, c, i){
return p != -1 ? p : c.indexOf('IN') != -1 ? i : -1;
}, -1);
var last = arr.reduceRight(function(p, c, i, a){
return p != -1 ? p : c.indexOf('NN') != -1 ? i : -1;
}, -1);
arr = arr.slice(first, last 1);
Демонстрация: http://jsfiddle.net/8WS3g /
Примечание: методы Array.reduce
and Array.reduceRight
поддерживаются только в IE9 и более поздних версиях. (То же самое Array.index
относится и Array.indexOf
к методу and, используемому в вопросе, поэтому он не меняет требований.)
Комментарии:
1. и последнее. Как я могу получить все элементы, содержащие только (NN) ?
2. @user3743069: Вы можете использовать
filter
метод:var nn = arr.filter(function(v){ return v.indexOf('(NN)') != -1; });
.
Ответ №2:
Найдите подстроку, соответствующую вашим критериям, затем разделите ее. Первая часть использует регулярное выражение для поиска строки, которая заканчивается на (IN) . Вторая часть находит последний индекс (NN), затем добавляет 4, чтобы учесть 4 символа в (NN).
Вот так:
var str = "weather(NN) in(IN) boston(NN)";
str.substring(str.search(/[^s] (IN)/), str.lastIndexOf('(NN)') 4).split(' ')
//["in(IN)", "boston(NN)"]
Он также работает на:
var str = "weather(NN) in(IN) boston(NN) is(VBZ)";
//["in(IN)", "boston(NN)"]
var str = "bad(JJ) weather(NN) in(IN) boston(NN) is(VBZ)";
//["in(IN)", "boston(NN)"]
Комментарии:
1. Это не ищет элемент, содержащий
"IN"
, он всегда берет из второго элемента. Если строка, например, есть"bad(XX) weather(NN) in(IN) boston(NN)"
, она вернется["weather(NN)", "in(IN)", "boston(NN)"]
.2. подождите, @Guffa прав. как я могу заставить его работать
IN
не только после второго элемента.3. Моя ошибка, я неправильно понял вопрос. Я обновил свой ответ.