Модераторы: Sardar, Aliance

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проверка на наличие значения в массиве, Аналог ПХП'шной функции in_array 
V
    Опции темы
artuska
  Дата 8.1.2008, 12:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 68
Регистрация: 5.5.2007

Репутация: нет
Всего: нет



В ПХП есть хорошая функция, которая проверяет, есть ли в заданном массиве искомое значение. А в JS такая есть?
PM MAIL   Вверх
solenko
Дата 8.1.2008, 12:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1473
Регистрация: 15.1.2006
Где: Украина

Репутация: 9
Всего: 67



нет. Есть множество вариантов реализаций -> google -> JavaScript in_array


--------------------
Ла-ла-ла-ла
Заметьте, нет официального подтверждения, что это не просто четыре слога.
PM MAIL WWW ICQ Skype   Вверх
artuska
Дата 8.1.2008, 12:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 68
Регистрация: 5.5.2007

Репутация: нет
Всего: нет



Ну, во-первых, не множество, а всего несколько — в основном это циклы того или иного вида и перебор этих циклов плюс сравнение и ретурн тру или фолс. Просто я думал что будет какая-нить функция, ибо перебор циклом массива это дерьмовый вариант. Ну, ничего не поделаешь, буду делать перебором.

Добавлено через 2 минуты и 30 секунд
Ну да, по первой же ссылке в Гугле выдали мне перебор циклом — http://forum.de.selfhtml.org/archiv/2004/3/t76079/

Добавлено через 14 минут и 51 секунду
Вообщем, тема может быть закрытой. Всем спасибо.
PM MAIL   Вверх
dsCode
Дата 8.1.2008, 14:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 565
Регистрация: 8.9.2007
Где: Saint-Petersburg

Репутация: 19
Всего: 26



artuska, хотелось сказать - "можно подумать, что в пхп не перебором внутренняя функция сделана =)", но на самом деле - алгоритмов поиска тоже не мало - перебор - самый медленный (есть в два (например, бинарный поиск) и более раза быстрее - поищите).


--------------------
the .code inside
:my music
PM MAIL WWW ICQ Jabber   Вверх
solenko
Дата 8.1.2008, 15:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1473
Регистрация: 15.1.2006
Где: Украина

Репутация: 9
Всего: 67



dsCode, только для применения быстрых массив прийдется предваритльно отсортировать, что тоже время.



--------------------
Ла-ла-ла-ла
Заметьте, нет официального подтверждения, что это не просто четыре слога.
PM MAIL WWW ICQ Skype   Вверх
cruelangel
Дата 8.1.2008, 17:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 319
Регистрация: 12.9.2007

Репутация: 4
Всего: 8



PM MAIL   Вверх
solenko
Дата 8.1.2008, 18:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1473
Регистрация: 15.1.2006
Где: Украина

Репутация: 9
Всего: 67



cruelangel, Gecko 1.8b2 and later и только. В opera и ie нет такого.


--------------------
Ла-ла-ла-ла
Заметьте, нет официального подтверждения, что это не просто четыре слога.
PM MAIL WWW ICQ Skype   Вверх
dsCode
Дата 8.1.2008, 18:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 565
Регистрация: 8.9.2007
Где: Saint-Petersburg

Репутация: 19
Всего: 26



да и более того - внутри - опять же - перебор циклом, так что - разницы нет.


--------------------
the .code inside
:my music
PM MAIL WWW ICQ Jabber   Вверх
cruelangel
Дата 9.1.2008, 09:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 319
Регистрация: 12.9.2007

Репутация: 4
Всего: 8



> Gecko 1.8b2 and later и только. В opera и ie нет такого. 

ну так добавь.


> да и более того - внутри - опять же - перебор циклом, так что - разницы нет.

в исходники мозиллы посмотрел, да? smile давай ты не будешь сравнивать сишные откомпилированные циклы с яваскриптовыми.


PM MAIL   Вверх
solenko
Дата 9.1.2008, 12:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1473
Регистрация: 15.1.2006
Где: Украина

Репутация: 9
Всего: 67



cruelangel, я уж как-то добавлю, но вы даете ссылку на мануал, в котором говорится что эта функция уже есть и ничего реализовывать не нужно, а потом будет гора вопросов "почему не работает in_array".


--------------------
Ла-ла-ла-ла
Заметьте, нет официального подтверждения, что это не просто четыре слога.
PM MAIL WWW ICQ Skype   Вверх
egao
Дата 9.1.2008, 22:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 109
Регистрация: 6.8.2007

Репутация: -1
Всего: нет



у тебя браузер страницу не до конца загрузил?  smile 
PM MAIL   Вверх
artuska
Дата 10.1.2008, 12:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 68
Регистрация: 5.5.2007

Репутация: нет
Всего: нет



Цитата(dsCode @  8.1.2008,  14:08 Найти цитируемый пост)
artuska, хотелось сказать - "можно подумать, что в пхп не перебором внутренняя функция сделана =)", но на самом деле - алгоритмов поиска тоже не мало - перебор - самый медленный (есть в два (например, бинарный поиск) и более раза быстрее - поищите)


Не, я тоже уверен, что ядро ПХП'шной функции in_array() реализовано перебором массива. Перебор массива я могу и в ПХП и в ЯваСкрипте написать без проблем, но меня просто интересовала уже какая-нить готовая встроенная в язык функция. Чтобы не паритсья.

Спасибо, что напомнили про бинарный поиск. Я хоть почитал про него, вспомнил курс техникума )))

Но у меня ситуация немного другая.
У меня массив не упорядочен (но это не проблема его упорядочить — думаю в ЯваСкрипте есть функция сортировки массива).
В массиве у меня не цифровые значения, а строчные (правда строки тоже можно сравнивать..., но у меня в голове не укладывается, как произойдет сравнение строки "f_login" и "f_password" — сравнение же произойдет по длине строк, правильно?).

Задача была следующая. Есть форма с полями разного типа, большинство из этих полей — текстового типа (type="text"). При сабмите формы нужно проверить, заполнены ли обязательные поля и, если они не заполнены, задать им какой-нить стиль (document.myform.elements[i].className = "empty").
Так вот, на субимит событии повешана функция проверки полей, в вункции есть массив из имен тех полей, которые необходимы для заполнения. Цикл проходит всю форму попутно проверяя, есть ли в массиве конкретное поле, если есть — начинает проверку на то, заполнено ли оно.

Код

 Array.prototype.contains = function(elem){
  var i;
  for(i='0'; i<this.length; i++){
    if(this[i] == elem){
      return true;
    }
  }

  return false;
 };

 var required = new Array("f_name", "f_phone", "f_email");

 for(var j='0'; j<document.formv.length; j++)
  {
    if(required.contains(document.formv.elements[j].name))
     {
       switch(document.formv.elements[j].type)
        {
          case "textarea":
          case "file":
          case "text":
           {
             if(document.formv.elements[j].value=="")
              {
                submitform = '0';
                string = "Необходимо заполнить все выделенные поля!\n";

                document.formv.elements[j].className = "empty";
              }
           }
          break;
        }
     }
  }


Ну, здесь все легко, начальные знания ЯваСкрипта и все.

Бинарный поиск подразумевает сравнить искомый элемент с центральным элементом массива — если искомый элемент больше, значит идем вверх по массиву и ищем там, если искомый элемент меньше — идем вниз массива и ищем там. Как мне здесь сравнить эти сроки?
PM MAIL   Вверх
solenko
Дата 10.1.2008, 14:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1473
Регистрация: 15.1.2006
Где: Украина

Репутация: 9
Всего: 67



artuska, строки сравниваются не по длинне, а последовательно по симводам, т.е.
w > aa == true




--------------------
Ла-ла-ла-ла
Заметьте, нет официального подтверждения, что это не просто четыре слога.
PM MAIL WWW ICQ Skype   Вверх
AKS
Дата 10.1.2008, 18:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Участник форума
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 20.9.2006

Репутация: 27
Всего: 52



Цитата(artuska @  10.1.2008,  12:33 Найти цитируемый пост)
Но у меня ситуация немного другая.

Действительно. И в этой ситуации можно, думаю, обойтись без "переборки" массива, сделав как-нибудь так (все, кстати, знают, но что-то молчат smile ):
Код

var required = {
    f_name: true,

    f_phone: true,

    f_email: true
};

var type = {
    textarea: true,
    
    file: true,
    
    text: true
};

if (typeof type.hasOwnProperty == 'function') {
    var elms = document.formv.elements;
    var i = elms.length >>> 0;
    var curr;
    label: while (i--) {
        curr = elms[i];
        if (!required.hasOwnProperty(curr.name) ||
                !type.hasOwnProperty(curr.type) ||
                typeof curr.value == 'string' &&
                !curr.value.length) {
            continue label;
        };
        submitform = false;
        string = 'Необходимо заполнить все выделенные поля!\n';
        curr.className = 'empty';
    };
};

Единственное,  что меня смутило - это сравнение типа текстового поля со строкой "textarea". Такой тип бывает? Как бы то ни было, я просто переписал так, как у Вас (разбирайтесь сами)...

PM MAIL   Вверх
egao
Дата 10.1.2008, 21:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 109
Регистрация: 6.8.2007

Репутация: -1
Всего: нет



вот извращенцы smile
лучше обязательным полям задать класс "required" и при сабмите пробежаться по всем полям с проверкой на обязательность.
и не надо сюда привлекать такие страшные термины как "бинарный поиск", "алгоритмическая сложность" и "сферический конь в вакууме"  smile 
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Форум для вопросов, которые имеются в справочниках, но их поиск вызвал затруднения, или для разработчика требуется совет или просьба отыскать ошибку. Напоминаем: 1) чётко формулируйте вопрос, 2) приведите пример того, что уже сделано, 3) укажите явно, нужен работающий пример или подсказка о том, где найти информацию.
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0547 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.