Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Функция find для поиска в массиве (https://javascript.ru/forum/misc/28818-funkciya-find-dlya-poiska-v-massive.html)

Hekumok 04.06.2012 00:54

Функция find для поиска в массиве
 
Итак, здравствуйте =)
Мне нужно создать функцию find (arr, value), которая ищет в массиве arr значение value и возвращает его номер, если найдено, или -1, если не найдено.
Вот что получилось (без вывода -1, если не найдено):
var massive = [2, 'crack', 'find', 2] ;
var mass = [5, 'al', 1] ;
var b = function(arr, value) {
for (var i = 0; i < arr.length; i++) {
if (value == arr[i]) {alert(i)}
else if (value !== arr[i]) {continue} } ;
} ;
b(massive, 2) ; // 0, 3
b(mass, 'al') ; // 1
b(mass, 2) ; //
b(massive, 'al') ; //
Вот, всё норм, выводит номер, если значение есть. Но у меня никак не получается сделать, чтобы, если значение не найдено, выводило -1, уже несколько способов перепробовал, результат - нулевой, либо выводит -1 после каждого вызова функции =( помогите, плиз

dmitriymar 04.06.2012 00:59

Else не нужно. При нахождении соответствия ставь еще флаг. По окончанию цикла - если флаг не установлен значит алерт -1

Hekumok 04.06.2012 01:04

простите, дмитрий, else я сделал, т.к. я там мудрил с этим -1, и убрать забыл...а что такое "флаг" я не знаю...объясните, плиз =)

dmitriymar 04.06.2012 01:14

Флаг - просто любая переменная принимал щадя опр значение при выполнении условия

Deff 04.06.2012 01:14

<script type="text/javascript">
 var Arr_1 = [2, 'crack', 'find', 2];

 function Find_El_Array ( arr, val ) {	
   for(var i in arr) {if (val == arr[i]) return i; }
   return false; 
 }

 alert( Find_El_Array (Arr_1, 2) )
 alert( Find_El_Array (Arr_1, 1) )

</script>


Дубово - но стандартно

Hekumok, Ксать - Вопрос - если в массива два совпадения ?

Hekumok 04.06.2012 01:19

дмитрий, а, ну я так и делал, но у меня там выводило -1 после каждого вызова функции! Может, я просто что-то не так делал...если нетрудно, можно скрипт?

Deff 04.06.2012 01:23

Hekumok,
:) Мой не подошел ? (там false вместо -1
-1 может быть в массиве - если нет поменяйте false на -1

Hekumok 04.06.2012 01:23

Deff, если в массиве 2 совпадения, то нужно чтобы выводило номер каждого!
И Ваш скрипт хорош =) но мне нужно, чтобы если совпадений нет, то выводило -1

Hekumok 04.06.2012 01:24

Deff, спасибо, попробую =)

Deff 04.06.2012 01:24

Hekumok,
Т.е на выходе должен быть массив ?

Deff 04.06.2012 01:29

Hekumok,
<script type="text/javascript">
 var Arr_1 = [2, 'crack', 'find', 2];

 function Find_El_Array ( arr, val ) {
   var array_OUT = [];
   for(var i in arr) {if (val == arr[i]) array_OUT.push(i);}
   if(array_OUT.length) return array_OUT;
   return -1; 
 }

 alert( Find_El_Array (Arr_1, 2) )
 alert( Find_El_Array (Arr_1, 1) )

</script>

Hekumok 04.06.2012 01:34

Deff, попробовал ваш скрипт, вставив -1 вместо false, вывело почему-то три нуля:

var massive = [2, 'crack', 'find', 2] ;
var mass = [5, 'al', 1] ;
function find(arr, val) {
for (var i in arr) {
if (value = arr[i]) return i ;}
return -1 ; } ;
alert(find(massive, 2)) ;
alert(find(mass, 'al')) ;
alert(find(mass, 2)) ;
alert(find(massive, 'al')) ;

Hekumok 04.06.2012 01:37

Deff, нет, на выходе массив не нужен...нужно просто, чтобы через alert вывело номер значение, если есть совпадение, если 2 совпадения, то должно быть 2 алерта с номерами, а если нет совпадений, то должно вывести -1

Deff 04.06.2012 01:37

Hekumok,

Три 0 занчит три элемента первых в списке - Первый элемент 0 -номер

массивы начинаются с 0

Deff 04.06.2012 01:39

Цитата:

Сообщение от Hekumok
Deff, нет, на выходе массив не нужен...нужно просто, чтобы через alert вывело номер значение, если есть совпадение, если 2

Если есть совпадения - То выводится массив Номеров совпадений

к примеру
1, 2, 3 (Совпали
----------------------
можно сделать строку цифр через запятую, но тогда вам придется цифры вычленять из строки

в так перебираете массив ответных совпадений в цикле

Hekumok 04.06.2012 01:41

Deff, да я знаю, что с нуля элементы начинаются, но с такими массивами
var massive = [2, 'crack', 'find', 2] ;
var mass = [5, 'al', 1] ;
должно было вывести
alert(find(massive, 2)) ; // 0, 3
alert(find(mass, 'al')) ; // 1
alert(find(mass, 2)) ; // -1
alert(find(massive, 'al')) ; // -1

Deff 04.06.2012 01:44

Hekumok,
Первый код был расчитан на одно совпадение(У Всех) - подставляйте во второй

Короткие имена типа Find - лучше не делать - подобные операторы часто есть в библиотеках

Hekumok 04.06.2012 01:44

Deff, лучше бы конечно, чтобы через "алерт" выводило каждое совпадение, но можно и как вы предложили с новым массивом

Hekumok 04.06.2012 01:45

Цитата:

Сообщение от Deff (Сообщение 178629)
Hekumok,
Первый код был расчитан на одно совпадение(У Всех) - подставляйте во второй

Не понял чё-та...

Deff 04.06.2012 01:46

Hekumok,
Пост 12

Deff 04.06.2012 01:58

Maxmaxmахimus,
Код - прекрасен! (*но кому в первом классе дают интегральное исчисление - Челу нужен базис и последовательность методов

Hekumok 04.06.2012 02:02

Deff, сделал по 12 посту, вабще ничего не выводит =(
var massive = [2, 'crack', 'find', 2] ;
var mass = [5, 'al', 1] ;
function find_elem(arr, val) {
var end = [ ] ;
for (var i in arr) {
if (value == arr[i]) end.push(i) ; } ;
if (end.length) return end ;
return -1 ; } ;
alert(find_elem(massive, 2)) ;
alert(find_elem(mass, 'al')) ;
alert(find_elem(mass, 2)) ;
alert(find_elem(massive, 'al')) ;

Hekumok 04.06.2012 02:05

maxmaxmaximus, чё-та я половину не понимаю в вашем скрипте

devote 04.06.2012 02:17

Цитата:

Сообщение от Hekumok
maxmaxmaximus, чё-та я половину не понимаю в вашем скрипте

И не пытайтесь, его скрипт плох по двум причинам, он добавляет новый метод во встроенный объект, что является плохим тоном. Во вторых он не будет работать в ИЕ7-ИЕ8

Hekumok 04.06.2012 02:22

Maxmaxmaximus, спасибо, что объяснили, я понял =)
Цитата:

Сообщение от devote (Сообщение 178645)
И не пытайтесь, его скрипт плох по двум причинам, он добавляет новый метод во встроенный объект, что является плохим тоном. Во вторых он не будет работать в ИЕ7-ИЕ8

devote, я уже попытался =) и понял этот скрипт =)

Hekumok 04.06.2012 02:23

Цитата:

Сообщение от Maxmaxmахimus (Сообщение 178647)

ХаХ, супер =D

Hekumok 04.06.2012 02:26

Maxmaxmaximus, а что такое "Array.prototype.find"?

Deff 04.06.2012 02:27

Hekumok, Просто не нун переименовывать Всё и всё сразу - стандартная метода:
1. Смотрим Как есть
2. Меняем Одну переменную -смотрим
3. Добавляем Свои параметры

function find_elem(arr, value) {
var end = [];
 for (var i in arr) { if (value == arr[i]) end.push(i) }
 if (end.length) return end ;
 return -1 ; 
}
var massive = [2, 'crack', 'find', 2] ;
var mass = [5, 'al', 1] ;

alert("find_elem(mass, 'al') : "+find_elem(mass, 'al')) ;
alert("find_elem(mass, '2') : "+find_elem(mass, 2)) ;
alert("find_elem(massive, 'al') : "+find_elem(massive, 'al')) ;
alert("find_elem(massive, '2') : "+find_elem(massive, 2)) ;

Hekumok 04.06.2012 02:30

deff, спасибо, понял, в чём у меня была ошибка в скрипте по 12посту, я вместо val написал value, теперь всё правильно выводит =)

Hekumok 04.06.2012 02:33

deff, спасибо, но у меня уже всё получилось =)

Hekumok 04.06.2012 09:43

и снова здравствуйте =)
Неохота создавать новую тему, поэтому я напишу в этой...в общем, вот скрипт:
var massive = [2, 'crack', 3, 6, 'find', 2] ;
var end = [ ] ;
function filter(arr, min, max) {
for (var key in arr) {
function isNumeric( ) {
if (!isNaN (parseFloat(arr[key])) && isFinite(arr[key])) {if (arr[key] >= min && arr[key] <= max) end.push(arr[key]) } ;
} ;
isNumeric( ) ;
} } ;
filter(massive, 0, 5);
alert (end) ;  // 2,3,2

Здесь всё правильно, но у меня не получается сделать так, чтобы элементы сохранялись не в переменную end, a в переменную, вызвавшую функцию? Bom пример:
var filter_end = filter(massive, 0, 5) ; // теперь filter_end = [2, 3, 2]
alert (filter_end) ; // 2,3,2

devote 04.06.2012 09:49

function filter( arr, min, max ) {

    var end = [];

    for ( var key in arr ) {

        if ( !isNaN( parseFloat( arr[ key ] ) ) && isFinite( arr[ key ] ) ) {

            if ( arr[ key ] >= min && arr[ key ] <= max ) {

                end.push( arr[ key ] )
            }
        }
    }

    return end;
}

var massive = [2, 'crack', 3, 6, 'find', 2];
var filter_end = filter( massive, 0, 5 );
alert( filter_end ) ;  // 2,3,2

Hekumok 04.06.2012 09:59

devote, спасибо, что-то я тупанул =)

Hekumok 04.06.2012 13:37

итак, это снова я =)
Мне нужно создать функцию filter(arr, func), которая получает массив arr и возвращает новый, в который входят только
те элементы arr, для которых func возвращает true.
Вот такой у мя получился скрипт, но у меня почему-то получается, что func всегда возвращает true, даже если, как в примере ниже, указать, чтобы она возвращала false.
function filter(arr, func) {
for (var key in arr) {
function isNumeric( ) {
if (!isNaN (parseFloat(arr[key])) && isFinite(arr[key])) {if (func = true) end.push(arr[key])} ;
} ;
isNumeric( ) ;
} ;
return end ;
} ;
var end = [ ] ;
var massive = [1, 'endof', 'trial', 5, 1, 3, 'call', 7] ;
var proba = filter(massive, function() {return false
}) ;
alert (proba) ;  // 1,5,1,3,7 , хотя должно быть пусто!

beard 04.06.2012 13:49

func = true

нужно
func == true

Hekumok 04.06.2012 13:52

я так уже пробовал, выводит пустое окно:
function filter(arr, func) {
for (var key in arr) {
function isNumeric( ) {
if (!isNaN (parseFloat(arr[key])) && isFinite(arr[key])) {if (func == true) end.push(arr[key])} ;
} ;
isNumeric( ) ;
} ;
return end ;
} ;
var end = [ ] ;
var massive = [1, 'endof', 'trial', 5, 1, 3, 'call', 7] ;
var proba = filter(massive, function() {return true
}) ;
alert (proba) ; // пусто, а должно '1,5,1,3,7'

beard 04.06.2012 13:56

func() == true

Hekumok 04.06.2012 14:08

спасибо, получилось, но теперь не пойму, как сделать, чтобы при
var arr = [1, 'endof', 'trial', 5, 1, 3, 'call', 7] ;
var res = filter(arr, function(a) {return a >= 3 && a <= 5 ;}) ;
alert (res) ;

был результат 5, 3

Hekumok 04.06.2012 14:25

Maxmaxmaximus, но мне нужно чтобы именно через var res = filter(arr, function() {...}) , a не var res = arr.filter(function() {...}) !

Deff 04.06.2012 15:08

Hekumok,
:yes: Эт не Важно как - поставь свою переменную
Maxmaxmахimus
Гы, чувствую себя неловко, с равной кармой


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