Web-инжиниринг

Array


Массивы

Массивы делятся на встроенные(document.links[], document.images[],...) и определяемые пользователем (автором документа). Встроенные массивы мы подробно обсуждаем в разделах "Программируем картинки", "Программируем формы" и "Программируем гипертекстовые переходы". Поэтому подробно остановимся на массивах, определяемых пользователем. Для массивов определено несколько методов:

  • join()
  • reverse()
  • sort()
  • и свойство length, которое позволяет получить число элементов массива. Это свойство активно используется в примерах данного раздела. Например, при обсуждении метода join().

    Для определения массива пользователя существует специальный конструктор:

    a = new Array();

    b = new Array(10);

    c = new Array(10,"Это значение");

    Пример использования:

    <script>

    c = new Array(30,"Это значение");



    </script>

    <form><input size=&&nbsp{c[0];};

    value=& {c[1];};

    onFocus="this.blur();">

    </form>

    document.f.i.size=c[0];

    document.f.i.value=c[1];

    Как видно из этого примера, массив может состоять из разнородных элементов. Массивы не могут быть многомерными.

    Для работы с массивами в JavaScript применяются методы join(), reverse(), sort(), а также массивы обладают свойством длины length.

    Метод join()

    Метод join() позволяет объединить элементы массива в одну строку. Он является обратной функцией к методу split(), который применяется к объектам типа STRING. Рассмотрим пример преобразования локального URL в URL схемы http:

    window.location:

    document.write(window.location.href+"

    ");

    document.write("Выполнили:
    b = window.location.href.split('/');
    ");

    b = window.location.href.split("/")

    document.write("

    Получили массив b:
    ");

    for(i=0;i");

    document.write("


    Заменили схему и вставили \"host:port\":
    ");

    document.write("for(i=0;i<b.length;i++)
    ");

    document.write("{
    ");

    document.write("if(b[i]==\"file:\") b[i] = \"http:/\";
    ");

    document.write("if(b[i]==\"c%7C\") b[i] = \"remote.host.domain:80\";
    ");

    document.write("}
    ");

    document.write("

    Получили массив b:
    ");

    for(i=0;i");

    document.write("

    Слили элементы массива b:
    ");

    document.write("l=b.join(\"/\");
    ")

    l=b.join("/");

    document.write("

    Получили в результате:
    ");

    document.write(l+"
    ")

    Другой пример использования метода join() - замена символа в строке:

    str = "document.img1.src='http://images/imag1.gif';"

    document.write(str);

    Исходная строка:

    str = "document.img1.src='http://images/imag1.gif';"

    document.write(str);

    Заменяем в строке все единицы на двойки:

    b = str.split('1');

    str = b.join('2');

    и получаем следующий результат:

    b = str.split('1');

    str = b.join('2');

    document.write(str);

    Последний пример показывает, что массив пользователя можно получить и без явного применения конструктора массива. Массив элементов строки получается просто как результат действия функции split().


    начало страницы


    Метод reverse()

    Метод reverse() применяется для изменения на противоположный порядка элементов массива внутри массива. Предположим, массив натуральных чисел упорядочен по возрастанию:

    a = new Array(1,2,3,4,5);

    Упорядочим его по убыванию:

    a.reverse();

    a = new Array(1,2,3,4,5);

    a.reverse();

    for(i=0;i");

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


    начало страницы


    Метод sort()

    Как это принято в современных интерпретируемых языках, например в Perl, метод sort() позволяет отсортировать элементы массива в соответствии с некоторой функцией сортировки, чье имя используется в качестве аргумента метода:



    a = new Array(1,6,9,9,3,5);

    function g(a,b)

    {

    if(a > b) return 1;

    if(a < b) return -1;

    if(a==b) return 0;

    }

    b = a.sort(g);

    В результате выполнения этого кода получим массив следующего вида:

    a = new Array(1,6,9,9,3,5);

    function g(a,b)

    {

    if(a > b) return 1;

    if(a < b) return -1;

    if(a==b) return 0;

    }

    b = a.sort(g);

    for(i=0;i");

    Возможность задания произвольной функции сортировки дает возможность гибкого анализа строковых объектов. Одним из таких примеров может служить анализ строки атрибута src контейнера IMG, если картинка подставляется скриптом, и сортировка полей формы по значениям:

    document.image.src = "http://www.kuku.ru:80/cgi-bin/image?x=10&y=20&z=15";

    Выделим x и y. Затем отсортируем их:

    str = "http://www.kuku.ru:80/cgi-bin/image?x=10&y=20&z=15";

    s = str.split('?');

    s1 = s[1].split('&');

    s2 = s1.sort(v);

    for(i=0;i<s2.length;i++) document.write("s2["+i+"]='"+s2[i]+"'<br>");

    str = "http://www.kuku.ru:80/cgi-bin/image?x=10&y=20&z=15";

    s = str.split('?');

    s1 = s[1].split('&');

    s2 = s1.sort(v);

    for(i=0;i");

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


    Содержание раздела