Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Поиск вхождения подстроки в массиве строк. (https://javascript.ru/forum/misc/15405-poisk-vkhozhdeniya-podstroki-v-massive-strok.html)

FINoM 25.02.2011 04:35

Поиск вхождения подстроки в массиве строк.
 
Хотелось бы более оптимальное решение, чем использование цикла. indexOf с регуляркой в качестве аргумента не работает :( .

ksa 25.02.2011 09:13

Цитата:

Сообщение от FINoM
indexOf с регуляркой в качестве аргумента не работает

В каком смысле не работает? Сломался чёле? :)

Matre 25.02.2011 09:32

Цитата:

В каком смысле не работает? Сломался чёле?
При попытке засунуть в indexOf регэксп он преобразуется в строку и поиск не даёт верного результата.

alert("Hello, world!".indexOf(/\w/));


Не зря же придумали String.prototype.search.

FINoM, а что тут такого сложного? Цикл + search/indexOf.

ksa 25.02.2011 09:49

Цитата:

Сообщение от FINoM
Хотелось бы более оптимальное решение, чем использование цикла

Х/з про оптимальность... :) Но вариант без цикла.

<!DOCTYPE html>
<html>
<head>
<title></title>
<style type="text/css">
</style>
<script>
	var of={}
	var re=/bbb/
function Go() {
	var a=['aaa','bbb','ccc']
	a.sort(aFind)
	var i
	for (i in of) {
		alert(i)
	}
}
function aFind(A,B) {
	if (A.search(re)!=-1) {
		of[A]=0
	}
	return 0
}
</script>
</head>
<body>
<input type='button' value='Go' onclick='Go()' />
</body>
</html>

Questioner 26.02.2011 23:21

Matre,
че значит -1?

FINoM 27.02.2011 04:52

Как обычно, предлагаю решение своей же проблемы :)
function f(arr, substring, separator) {
   var s = arr.join(separator);
   var i = s.indexOf(substring);
   if (i==-1) {
      return -1;
   }
   s = s.slice(0,i);
   return s.split(separator).length - 1;
}
var arr = ['qwerty','uiopas','dfghjk'];
var substring = 'fg'; 
var separator = '#*#*#*#'; // какая-нибудь уникальная строка
alert(f(arr, substring, separator))
Есть минус: найдет только первое вхождение строки (кто хочет, тот допишет).

А какой максимальный размер строки в яваскрипт?

monolithed 27.02.2011 10:29

Цитата:

Сообщение от Matre
Не зря же придумали String.prototype.search.

alert(Array.prototype.search == constructor.search);  //true
alert(RegExp.prototype.search == constructor.search); //true
alert(String.prototype.search == constructor.search); //false

А если уж нужно, токроссбраузерное решение indexOf():
//Array.indexOf
(function(A) {
    A.indexOf = A.indexOf || function(object) {
        var i = this.length;
        while(i--) {
            if(i in this && this[i] === object) {
                return i;
            }
        }
        return -1;
    };
})(Array.prototype);

//String.indexOf
String.prototype.indexOf = function(str) {
    return this.search(str);
};

alert('String.indexOf: '+'12345'.indexOf('4')+ '\n' + 'Array.indexOf: '+[1, 2, 3, 4, 5].indexOf(4));

with-love-from-siberia 27.02.2011 11:00

Цитата:

Сообщение от monolithed
[this].join().search(str)

Каков смысл таких столь странных преобразований?

monolithed 27.02.2011 11:53

Цитата:

Сообщение от with-love-from-siberia
Каков смысл таких столь странных преобразований?

в конкретном случае - никакого смысла нет, о другом думал, потом передумал, а часть мысли осталась :)


Часовой пояс GMT +3, время: 01:55.