Поиск в массиве, частичное совпадение
Подскажите пожалуйста, как проверить есть ли элемент в массиве, используя в поиске часть его имени? Например, есть массив
var massiv = ["яблочный пирог", "соус_острый", "яблоки_красные"]как проверить, есть ли в массиве элемент с частичным совпадением "яблок", и получить его номер в массиве? |
Цитата:
|
фонарик,
а если элементов совпавших не 1 который выдавать? |
Цитата:
Пытался найти в гугле что-то на эту тему, но кроме обычного поиска по массиву, ничего не нашел. Регулярные выражения никак не даются в понимании, да и ранее подобной задачи никогда не встречал :-? |
Цитата:
а в рнр вообще есть функция для вычисления расстояния |
var massiv = ["яблочный пирог", "соус_острый", "яблоки_красные"];
function findPartial( a, s )
{
for( var i = 0; i < a.length; ++i )
if( a[i].indexOf( s ) >= 0 )
return i;
return -1;
}
alert( findPartial( massiv, "яблок" ) );
|
Мсье rgl, спасибо вам за решение, надеюсь я все-таки смогу понять как оно работает. Да и регулярных выражений вроде как и нет :-?
|
var massiv = ["яблочный пирог", "соус_острый", "яблоки_красные"];
function findPartial( a, s )
{
for( var i = 0; i < a.length; ++i )
if( a[i].indexOf( s ) >= 0 )
return i;
return -1;
}
alert( findPartial( massiv, "яблокo" ) );
Цитата:
|
dmitriymar,
Из вопроса, а также из приведенного примера можно предположить, что под частичным совпадением понимается вхождение: Цитата:
Я понял вопрос именно так (вхождение), единственное, в чем сомневался, так это искать везде или строго в начале. Если нужно строго вначале, то проверку >= 0 можно заменить на == 0 |
Частичное совпадение я обозначил весьма буквально - выражение в кавычках "яблок". Т.е нужно значение что в кавычках проверить нет ли точных совпадений в массиве, т.е елемента в котором есть все символы что в кавычках. Решение rgl то, что и хотелось в итоге получить :)
|
Вариант частичного совпадения ...
var massiv = ["яблочный пирог", "соус_острый", "яблоки_красные"];
function findPartial(a, s) {
while (s) {
var reg = new RegExp(s)
for (var i = 0; i < a.length; i++)
if (reg.test(a[i])) return i;
s = s.slice(0, -1)
}
return -1;
}
alert(findPartial(massiv, "яблокo"));
|
Цитата:
Полное вхождение Частичное вхождение Полное совпадение Частичное совпадение - http://ru.wikipedia.org/wiki/%D0%A0%...B9%D0%BD%D0%B0 чем меньше расстояние тем выше частичное совпадение совпадение . В вашем же случае , находится полное вхождение
var massiv = ["яблочный пирог", "соус_острый", "яблоки_красные"];
function findPartial(a, s) {
while (s) {
var reg = new RegExp(s)
for (var i = 0; i < a.length; i++)
if (reg.test(a[i])) return i;
s = s.slice(1, -1)
}
return -1;
}
alert(findPartial(massiv, "яблосоус"))
тоже такой момент, и почемуто мне кажется что искомое вхождение всё таки больше похоже на 1 или 3 элемент поискового подмножества :) |
var massiv = ["яблочный пирог", "соус_острый", "яблоки_красные"];
function findPartial( a, s )
{
var i;
if( s.length > 3 ) {
i = s.length - 3;
var r = s.substr( i, 3 );
while( --i >= 0 )
r += "|" + s.substr( i, 3 );
r = new RegExp( r );
for( i = 0; i < a.length; ++i )
if( r.test( a[i] ) )
return i;
} else {
for( i = 0; i < a.length; ++i )
if( a[i].indexOf( s ) >= 0 )
return i;
}
return -1;
}
alert( findPartial( massiv, "острота" ) );
|
rgl,
http://www.snippy.ru/snippet/1634-an...na-javascript/ и естественно победитель с минимальным расстоянием , алгоритм используется активно и очень плотно |
Цитата:
|
рони,
да , запарился . в любом случае вариант на расстояниях решение гораздо правильнее |
рони,
Все классно и круто, только не понятно зачем сначала искать более длинную часть, если все равно все определяется тем, найдется ли более короткая. Т.е. можно сразу искать только первую букву. Да и регэкспы без необходимости использовать зачем? |
Цитата:
|
рони,
поправил тест . Сможете обосновать почему соус более релевантен чем яблоко?) яблоко ведь стоит в начале слова , и вполне логично , что более подходящий вариант связан с яблоком для стран с письменностью слева направо :) |
Цитата:
|
Цитата:
|
Цитата:
Цитата:
|
Цитата:
|
Цитата:
|
var massiv = ["яблочный пирог","соус_острый_1","яблоки_красные","соус_острый_8"];
function findPartial(a, s)
{
var zz = []
for( var i = 0; i < a.length; ++i )
if( a[i].indexOf(s) >= 0 )
zz.push(i)
return zz
return -1;
}
alert( findPartial( massiv, "соус_острый" ) )
Вроде работает )) |
Цитата:
var massiv = ["яблочный пирог","соус_острый_1","яблоки_красные","соус_острый_8"];
function findPartial(a, s)
{
var zz = []
for( var i = 0; i < a.length; ++i )
if( a[i].indexOf(s) >= 0 )
zz.push(i)
return zz // тут отсутп был неправильный, ибо выполняется всегда, а не внутри if
// return -1; //а это вообще никогда не выполняется
}
alert( findPartial( massiv, "соус_острый" ) )
|
| Часовой пояс GMT +3, время: 20:13. |