Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > JavaScript: для новичков > Существование элемента в массивах


Автор: vitalina 17.11.2009, 13:49
Есть, например, три массива:
("а", "и", "т")
("б", "к", "у")
("в", "л", "ф")

Не могу сообразить как сделать: пользователь ввёл в поле букву "к", скрипт проверяет в каком массиве эта буква и выводит число 2. В дальнейшем я планирую суммировать эти числа, но думая с этим я сама справлюсь.

Автор: Amphiluke 17.11.2009, 14:42
А нельзя что-ли все массивы последовательно просмотреть?
Код

<script type="text/javascript">
    var arr1 = ["а", "и", "т"];
    var arr2 = ["б", "к", "у"];
    var arr3 = ["в", "л", "ф"];
    
    function whereLetterLocated(letter) {
        var str = arr1.join(";");
        if (str.indexOf(letter) != -1)
            return 1;
        str = arr2.join(";");
        if (str.indexOf(letter) != -1)
            return 2;
        str = arr3.join(";");
        if (str.indexOf(letter) != -1)
            return 3;
        return -1;
    }
    
    alert(whereLetterLocated("к"));
</script>

Автор: vitalina 17.11.2009, 14:48
Как-то всё сложно, а проще нельзя? У меня работает, но почему-то алерт выскакивает 2 раза...

Добавлено через 3 минуты и 2 секунды
Знаю зачем document.write, а зачем return? А return -1?

Добавлено через 5 минут и 30 секунд
Почему используется return, а не document.write?

Автор: Amphiluke 17.11.2009, 15:01
Цитата(vitalina @  17.11.2009,  14:48 Найти цитируемый пост)
У меня работает, но почему-то алерт выскакивает 2 раза...

Один из них — точно не мой.  smile 


Цитата(vitalina @  17.11.2009,  14:48 Найти цитируемый пост)
Знаю зачем document.write, а зачем return? А return -1?

return необходим для того, чтобы функция вернула значение. Использовать метод document.write в можно исключительно во время загрузки страницы, а функции можно всегда, например, при возникновении события (кнопку нажали, курсор переместили и проч.).

return -1 выполнится в том случае, если пользователь введет буковку, которая вообще не встречается ни в одном массиве.

Добавлено через 2 минуты и 17 секунд
В вашем случае использовать метод document.write нельзя, т.к. требуется реакция на событие — пользователь ввел букву с клавиатуры.

Автор: vitalina 17.11.2009, 15:05
А если буковки, допустим в 2 полях, эти поля надо проверять по очереди? А если 9 полей по 1 букве? Можно ли эту проверку сделать одним махом?

Добавлено через 7 минут и 41 секунду
Если id формы =t1 писать alert(whereLetterLocated(t1));? У меня так пишет -1.

Автор: Amphiluke 17.11.2009, 15:19
Цитата(vitalina @  17.11.2009,  15:05 Найти цитируемый пост)
А если буковки, допустим в 2 полях, эти поля надо проверять по очереди? А если 9 полей по 1 букве? Можно ли эту проверку сделать одним махом?

Можно (почти) всё при наличии соответствующего опыта. При правильном построении страницы поля ввода должны находиться на форме. Назначьте форме идентификатор id, а полям какой-нибудь класс (например, class="inputField"), и когда пользователь введет все буковки и (я полагаю) нажмет на кнопочку, вызовите функцию, которая переберёт все поля на форме при помощи метода getElementsByTagName("input"), проверяя по ходу, обладает ли элемент формы соответствующим классом "inputField". Если обладает, то считать с поля значение value и выполнить ранее написанную функцию whereLetterLocated() (см. пост 2).

Я понимаю, что (наверное) звучит неперевариваемо, но на самом деле нужно немного почитать теорию, и тогда все станет просто и ясно... smile 

Цитата(vitalina @  17.11.2009,  15:05 Найти цитируемый пост)
Если id формы =t1 писать alert(whereLetterLocated(t1));? У меня так пишет -1.

Функция ждет, что вы будете передавать не id, а букву которую ввел пользователь (т.е. значение value поля).

Автор: vitalina 17.11.2009, 15:22
Объясните мне эту строчку: str.indexOf(text1.value) != -1

Автор: Amphiluke 17.11.2009, 15:29
Я с помощью метода join превращаю массив в строку из элементов массива. Метод indexOf проверяет, есть ли в строке указанный символ. Если есть, то indexOf возвращает позицию символа, а если нет, то возвращает -1. Это, на мой взгляд, самый простой способ проверить, есть ли буква в массиве...

Добавлено через 8 минут и 39 секунд
Вот что получилось у меня... smile 
Код

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Документ без названия</title>
<script type="text/javascript">
    var arr1 = ["а", "и", "т"];
    var arr2 = ["б", "к", "у"];
    var arr3 = ["в", "л", "ф"];
    
    function whereLetterLocated(letter) {
        var str = arr1.join(";");
        if (str.indexOf(letter) != -1)
            return 1;
        str = arr2.join(";");
        if (str.indexOf(letter) != -1)
            return 2;
        str = arr3.join(";");
        if (str.indexOf(letter) != -1)
            return 3;
        return -1;
    }
    
    function checkAllFields() {
        var __form = document.getElementById("_form");
        var resultArr = new Array(); // это массив номеров, где встречаются буквы
        for (var i = 0; i < __form.elements.length; i++) {
            if (__form.elements[i].className == "inputField") {
                resultArr.push(whereLetterLocated(__form.elements[i].value));
            }
        }
        return resultArr;
    }
</script>
</head>

<body>
<form action="#" id="_form">
    <input type="text" class="inputField" /><br />
    <input type="text" class="inputField" /><br />
    <input type="text" class="inputField" /><br />
    <input type="text" class="inputField" /><br />
    <input type="text" class="inputField" /><br />
    <input type="text" class="inputField" /><br />
    <input type="button" value="Ready" onclick="alert(checkAllFields());" />
</form>
</body>
</html>

Автор: vitalina 17.11.2009, 15:45
Спасибо, буду разбираться!

Автор: vitalina 17.11.2009, 16:25
6 полей, я буквы ввела в первые 3, а почему алерт говорит, что в трёх последний полях буквы в массивах 1?

Добавлено через 10 минут и 35 секунд
Цитата(Amphiluke @  17.11.2009,  14:42 Найти цитируемый пост)
 var str = arr1.join(";");
        if (str.indexOf(letter) != -1)



Я всё-таки не поняла почему -1? Почему алерт ввыводит запятую, когда мы не давали такой команды?

Автор: vitalina 17.11.2009, 16:45
А если слова в алерте написать ещё надо? Так: return "ok" resultArr; у меня не работает. Как правильно?

Автор: Amphiluke 17.11.2009, 17:09
Цитата(vitalina @  17.11.2009,  16:25 Найти цитируемый пост)
6 полей, я буквы ввела в первые 3, а почему алерт говорит, что в трёх последний полях буквы в массивах 1?

Значит, так оно и есть. Все массивы содержат «cимвол» "" (пустой). Но если нужно избежать этого эффекта, то придется предусмотреть этот случай явно.
Код

    function whereLetterLocated(letter) {
        if (letter == "")
            return -1;
        var str = arr1.join(";");
        if (str.indexOf(letter) != -1)
            return 1;
        str = arr2.join(";");
        if (str.indexOf(letter) != -1)
            return 2;
        str = arr3.join(";");
        if (str.indexOf(letter) != -1)
            return 3;
        return -1;
    }



Цитата(vitalina @  17.11.2009,  16:45 Найти цитируемый пост)
А если слова в алерте написать ещё надо? Так: return "ok" resultArr; у меня не работает. Как правильно?

Определитесь, что конкретно вы хотите видеть на выходе. Если строку, то измените так:
Код

return "ok " + resultArr.join(",")


P.S. Я использую alert лишь для примера, вы можете выводить результат на страницу (только не через document.write). А массив возвращается лишь только потому, что вы говорили о необходимости дальнейшей работы с этими числами.
Цитата(vitalina @  17.11.2009,  13:49 Найти цитируемый пост)
В дальнейшем я планирую суммировать эти числа


Автор: vitalina 17.11.2009, 17:23
Хм... большое спасибо! 

Раньше я поле1 + поле2, а сейчас что-то не соображу. а тут наверное больше кода будет, если суммировать сразу все числа...

Добавлено через 1 минуту и 57 секунд
Нету же sum(__form.elements[i].value)

Автор: Amphiluke 17.11.2009, 17:33
Цитата(vitalina @  17.11.2009,  17:23 Найти цитируемый пост)
Нету же sum(__form.elements[i].value)

Ну дак написать недолго:
Код

    function sum(arr) {
        var __sum = 0;
        for (var i = 0; i < arr.length; i++) {
            __sum += arr[i];
        }
        return __sum;
    }


Добавлено через 2 минуты и 52 секунды
P.S. А массив, который передается в эту функцию уже получен в функции checkAllFields.

Автор: vitalina 17.11.2009, 17:59
Как много кода! Какой файл огромный!

Автор: Amphiluke 17.11.2009, 18:02
Выведите весь Javascript в отдельный файл. Всё не так страшно будет. =)

Автор: vitalina 17.11.2009, 18:19
Я хочу, чтобы это было в форме.

Добавлено через 1 минуту и 24 секунды
Сделала форму и дописала функцию:
Код

function checkAllFields() {
 var key, sum=0;

        var __form = document.getElementById("_form");
        var resultArr = new Array(); // это массив номеров, где встречаются буквы
        for (var i = 0; i < __form.elements.length; i++) {
            if (__form.elements[i].className == "inputField") {
 resultArr.push(whereLetterLocated(__form.elements[i].value));
  

            }
        }
    for(var key in resultArr){
        sum += resultArr[key];
            }
    while (sum > 9 ) {
    sum = sum - 9;
            }
res.value=sum;
    return sum;   
    }


Не работает

Добавлено через 2 минуты и 40 секунд
А без res.value=sum; всё работает.

Автор: bars80080 17.11.2009, 18:27
ещё бы. а что такое res?

Автор: vitalina 17.11.2009, 18:38
id поля куда должен выводиться sum.

Добавлено через 2 минуты и 29 секунд
Я вывела результат в див. Получилось!
Сделала и заполнила 16 полей нажала на кнопку и


"Сценарий, исполняемый на этой странице, возможно занят или не отвечает. Вы можете остановить его сейчас или продолжить и посмотреть сможет ли он завершить свою работу.

Сценарий: file:///C:/Documents%20and%20Settings/%D0%9D%D0%B0%D1%82%D0%B0%D0%BB%D0%B8%D1%8F/Desktop/existarr.htm:50"

Добавлено через 6 минут и 30 секунд
14 полей только обрабатывает.

Автор: Amphiluke 17.11.2009, 18:57
vitalina, попробуйте переписать функцию
Код

    function whereLetterLocated(letter) {
        if (letter == "")
            return 0;
        var str = arr1.join(";");
        if (str.indexOf(letter) != -1)
            return 1;
        str = arr2.join(";");
        if (str.indexOf(letter) != -1)
            return 2;
        str = arr3.join(";");
        if (str.indexOf(letter) != -1)
            return 3;
        return 0;
    }


Возможно, это из-за -1  smile 

Автор: vitalina 17.11.2009, 19:02
Получилось!

Добавлено через 4 минуты
А как всё-таки сделать чтобы в поле выводилось?

Автор: vitalina 17.11.2009, 19:19
У меня почему-то не получается делать это с двумя разными классами. 

Код

<input type="text" class="inputField" size="1" />


и 

Код

<input type="text" class="inputField2" size="1" />


Дописала цифру 2. Там где поменяла - не работает!


Автор: vitalina 17.11.2009, 20:07
Цитата(vitalina @ 17.11.2009,  19:02)

А как всё-таки сделать чтобы в поле выводилось?

Так как же сделать?

Автор: Amphiluke 17.11.2009, 20:30
Цитата(vitalina @  17.11.2009,  19:19 Найти цитируемый пост)
У меня почему-то не получается делать это с двумя разными классами. 

На то и расчет, чтобы перебирать не все элементы формы (среди них есть и кнопки, и прочий «хлам»), а только поля, куда пользователь заносит буквы. Чтобы отличать эти поля от других элементов, им присвоили класс class="inputField". Но если вам необходимо использовать несколько классов, то при переборе проверяйте атрибут className так:
Код

if (__form.elements[i].className == "inputField") || (__form.elements[i].className == "inputField2") {

Для сокращения кода, можете потльзоваться ключевым словом with.


Цитата(vitalina @  17.11.2009,  19:02 Найти цитируемый пост)
А как всё-таки сделать чтобы в поле выводилось?

Назначить полю, в которое будете выводить, идентификатор id (например, id="resultField"), а потом присваивайте нужное значение атрибуту value этого поля:
Код

document.getElementById("resultField").value = ....

Автор: vitalina 17.11.2009, 21:33
Понятно!

Добавлено через 3 минуты и 44 секунды
Цитата(Amphiluke @  17.11.2009,  20:30 Найти цитируемый пост)
Для сокращения кода, можете потльзоваться ключевым словом with.

Поподробнее можно?


Автор: vitalina 17.11.2009, 22:18
Цитата(Amphiluke @  17.11.2009,  20:30 Найти цитируемый пост)
if (__form.elements[i].className == "inputField") || (__form.elements[i].className == "inputField2") {


У меня работает только первое условие, а второе, какое бы оно ни было не работает!

Автор: bars80080 17.11.2009, 23:15
Цитата(vitalina @  17.11.2009,  21:18 Найти цитируемый пост)
а второе, какое бы оно ни было не работает!

мдя. а вы можете просто вглядеться в код и попытаться подумать.
Amphiluke писал идею, он не проверял то что вам отдавал, не его прерогатива. ну ошибся, бывает. потестил бы - переписал.
можете, сами? он ведь не волшебной палочкой машет

Код

if (__form.elements[i].className == "inputField" || __form.elements[i].className == "inputField2") {


Автор: vitalina 18.11.2009, 01:34
Со всем справилась.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)