Я ищу функцию, которая находит подстроку из массива строк («иглы») в более длинной строке («стог сена»). По сути, я хочу, чтобы это работало так, как в этом примере:
var haystack = "abcdefghijklmnopqrstuvwxyz";
var needles = [
'bcd',
'pqr',
'hi',
'ghi',
'g',
'stuv'
];
var output = findSubstring (haystack, needles, 2, 20);
Вывод теперь должен иметь:
{index: 6, which: 3}
, что означает, что он нашел «ghi» (игла 3) в позиции 6. Он получает «ghi», а не «hi», потому что «ghi» начинается раньше в стоге сена, но не получает «g», потому что ghi 'находится ранее в массиве игл.
Это лучшее из того, что я придумал, но оно кажется довольно медленным на очень больших кусках текста и на очень больших массивах игл (что я и использую), и я уверен, что есть что-то лучшее , Это довольно критично для производительности, поэтому мне бы хотелось чего-то быстрее.
Я мог бы придумать лучшие способы сделать это (вероятно, не используя indexOf), и, поскольку (вероятно) это довольно распространенная вещь, у кого-то, имеющего больший опыт работы с такими вещами, мог бы быть лучший путь об этом. (то есть я бы предпочел не изобретать велосипед)
function findSubstring (haystack, needles, startIndex, endIndex) {
var min = Infinity, best = -1;
var numNeedles = needles.length;
if (!startIndex)
startIndex = 0;
for (var i=0; i<numNeedles; i++) {
var index = haystack.indexOf(needles[i], startIndex);
if (index != -1 && index < min) {
min = index;
best = i;
}
}
return (best == -1 || (endIndex && best >= endIndex)) ?
null :
{index: min, which: best};
}