получение фрагмента массива от первого элемента, содержащего строку, до последнего элемента, содержащего другой

#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. Моя ошибка, я неправильно понял вопрос. Я обновил свой ответ.