Индексные массивы

Flash Player 9 и более поздних версий, Adobe AIR 1.0 и более поздних версий

В индексных массивах хранится последовательность из одного или более значений, организованных таким образом, чтобы каждое значение было доступно через целое число без знака. Первый индекс всегда равен 0, а затем для каждого последующего элемента массива он увеличивается на 1. В ActionScript 3.0 в качестве индексных массивов используются два класса: Array и Vector.

В индексных массивах в качестве индекса используется целое 32-разрядное число без знака. Максимальный размер индексного массива равен 2 32 - 1 или 4 294 967 295. При попытке создать массив, превышающий максимально допустимый размер, произойдет ошибка при выполнении.

Для обращения к отдельному элементу индексного массива служит оператор доступа к массиву ( [] ), который позволяет указать позицию индекса для требуемого элемента. Например, следующий код представляет первый элемент (с индексом 0) в индексном массиве с именем songTitles .

songTitles[0]

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

songTitles[1] = "Symphony No. 5 in D minor";

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

var nextSong:String = songTitles[2];

Также в квадратных скобках можно использовать переменную вместо конкретного значения. (Переменная должна содержать неотрицательное целое число, например беззнаковое целое число, положительное целое число или экземпляр Number, представленный положительным целым числом.) Этот прием обычно используется для циклического прохождения элементов индексного массива и выполнения операции над некоторыми или всеми элементами. Следующий код демонстрирует этот прием. Код создает цикл для обращения к каждому значению в объекте Array с именем oddNumbers . Инструкция trace() используется для вывода каждого значения в следующем виде: «oddNumber[ index ] = value ».

var oddNumbers:Array = [1, 3, 5, 7, 9, 11]; 
var len:uint = oddNumbers.length; 
for (var i:uint = 0; i < len; i++) 
{ 
    trace("oddNumbers[" + i.toString() + "] = " + oddNumbers[i].toString()); 
}

Класс Array

Первый тип индексного массива представлен классом Array. Экземпляр Array может содержать значение данных любого типа. Один объект Array может содержать объекты, представленные разными типами данных. Например, один экземпляр Array может содержать значение String в позиции индекса 0, экземпляр Number в позиции 1 и объект XML в позиции 2.

Класс Vector

Другой тип индексного массива, поддерживаемый в ActionScript 3.0, представлен классом Vector. Экземпляр Vector — это типизированный массив , то есть все элементы в экземпляре Vector всегда имеют одинаковый тип данных.

Примечание. Класс Vector доступен для использования, начиная с Flash Player версии 10 и Adobe AIR версии 1.5.

Когда объявляется переменная Vector или создается экземпляр Vector, необходимо четко указать тип данных для объектов, которые может содержать Vector. Указанный тип данных называется базовым типом объекта Vector. Во время выполнения и компиляции (в строгом режиме) проверяется любой код, задающий или получающий значение элемента Vector. Если тип данных добавляемого или получаемого объекта не соответствует базовому типу Vector, выдается ошибка.

Помимо ограничения, связанного с типом данных, класс Vector имеет другие ограничения, которые отличают его от класса Array:

  • Вектор принадлежит к числу плотных массивов. Объект Array может иметь значения в позициях индекса 0 и 7, даже если нет значений в позициях с 1 по 6. Экземпляр Vector, напротив, должен иметь определенное значение (или null ) в каждой позиции индекса.

  • По желанию можно ограничить длину объекта Vector. Это значит, что количество элементов в массиве Vector не может изменяться.

  • Доступ к элементам вектора осуществляется с контролем границ. Вам никогда не удастся прочесть значение с индексом, превышающим индекс финального элемента ( length – 1). Вам также не удастся задать значение, индекс которого превышает текущий последний индекс (иначе говоря, значение можно присваивать только с существующим индексом или с индексом [length] ).

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

  • Производительность: доступ к массиву и итерация осуществляются гораздо быстрее при использовании экземпляра Vector, чем при использовании экземпляра Array.

  • Безопасность типа: в строгом режиме компилятор может выявлять ошибки, связанные с типом данных. К таким ошибкам относится присвоение экземпляру Vector значения неверного типа данных или попытка получить неверный тип данных при считывании значения из объекта Vector. Во время выполнения типы данных также проверяются при записи или чтении данных в объекте Vector. Однако следует учесть, что при использовании метода push() или unshift() для добавления значений в вектор типы данных для аргументов не проверяются во время компиляции. Тем не менее, при использовании этих методов значения проверяются во время выполнения.

  • Надежность: проверка диапазона во время выполнения (или проверка фиксированной длины) значительно увеличивает надежность по сравнению с экземплярам Array.

Если опустить дополнительные ограничения и преимущества, класс Vector очень похож на класс Array. Свойства и методы объекта Vector похожи (и в большинстве случаев идентичны) свойствам и методам объекта Vector. В большинстве случаев, когда используется объект Array, все элементы которого относятся к одному и тому же типу данных, предпочтительным является экземпляр Vector.

Создание массивов

Создавать экземпляры Array и Vector можно разными способами. Однако приемы, используемые для создания массива каждого типа, немного отличаются.

Создание экземпляра Array

Чтобы создать объект Array, нужно вызвать конструктор Array() или использовать синтаксис литерала Array.

Существует три способа использования функции конструктора Array() . Во-первых, можно вызвать конструктор без аргументов для создания пустого массива. Свойство length класса Array используется для проверки отсутствия элементов в массиве. Например, приведенный ниже код вызывает конструктор Array() без аргументов:

var names:Array = new Array(); 
trace(names.length); // output: 0

Во-вторых, если число является единственным параметром, который передается конструктору Array() , создается массив именно этой величины, а каждому элементу задается значение undefined . Аргументом должно быть целое число без знака от 0 до 4 294 967 295. Например, приведенный ниже код вызывает конструктор Array() , единственным аргументом которого является число:

var names:Array = new Array(3); 
trace(names.length); // output: 3 
trace(names[0]); // output: undefined 
trace(names[1]); // output: undefined 
trace(names[2]); // output: undefined

В-третьих, если вызвать конструктор и передать в качестве параметров список элементов, будет создан массив, элементы которого будут соответствовать этим параметрам. Приведенный ниже код передает три аргумента конструктору Array() :

var names:Array = new Array("John", "Jane", "David"); 
trace(names.length); // output: 3 
trace(names[0]); // output: John 
trace(names[1]); // output: Jane 
trace(names[2]); // output: David

Массивы также можно создавать с помощью литералов Array. Литерал Array можно назначить непосредственно переменной массива, как показано ниже:

var names:Array = ["John", "Jane", "David"];

Создание экземпляра Vector

Чтобы создать экземпляр Vector, нужно вызвать конструктор Vector.<T>() . Также для создания объекта Vector можно вызвать глобальную функцию Vector.<T>() . Эта функция преобразует указанный объект в экземпляр Vector. В Flash Professional CS5 и более поздних версиях, Flash Builder 4 и более поздних версиях, а также в Flex 4 и более поздних версиях экземпляр Vector можно создавать с помощью буквенного синтаксиса Vector.

Каждый раз при объявлении переменной Vector (а также параметра метода или типа возвращаемых данных метода класса Vector) необходимо указывать ее базовый тип. Кроме того, базовый тип необходимо указывать при создании экземпляра Vector с помощью конструктора Vector.<T>() . Другими словами, каждый раз при использовании термина Vector в коде ActionScript он сопровождается указанием базового типа.

Базовый тип указывается с помощью синтаксиса параметра типа. В коде параметр типа следует непосредственно за словом Vector . Он состоит из точки ( . ) и имени базового класса, заключенного в угловые скобки ( <> ), как показано в следующем примере:

var v:Vector.<String>; 
v = new Vector.<String>();

В первой строке примера переменная v объявлена как экземпляр Vector.<String> . Иначе говоря, он представляет индексный массив, который может содержать только экземпляры класса String. Вторая строка вызывает конструктор Vector() для создания экземпляра того же типа Vector (то есть массив Vector, все элементы которого являются объектами String). Этот объект присваивается переменной v .

Использование глобальной функции Vector.<T>()

Если конструктор Vector.<T>() используется без аргументов, он создает пустой экземпляр Vector. Чтобы убедиться в том, что экземпляр Vector пуст, нужно проверить свойство length . Например, следующий код вызывает конструктор Vector.<T>() без аргументов.

var names:Vector.<String> = new Vector.<String>(); 
trace(names.length); // output: 0

Если заранее известно, сколько элементов изначально должен иметь экземпляр Vector, можно предварительно определить количество элементов в Vector. Чтобы создать экземпляр Vector с требуемым числом элементов, передайте это число в качестве первого параметра (свойство length ). Так как элементы объекта Vector не могут быть пустыми, они заполняются экземплярами базового типа. Если базовый тип является ссылочным типом, который допускает значения null , то все элементы будут содержать значения null . В противном случае все элементы содержат значения по умолчанию для базового класса. Например, переменная, выраженная беззнаковым целым числом, не может иметь значение null . Поэтому в следующем коде экземпляр Vector с именем ages создается с семью элементами, которые имеют значение 0.

var ages:Vector.<uint> = new Vector.<uint>(7); 
trace(ages); // output: 0,0,0,0,0,0,0 

И, наконец, с помощью конструктора Vector.<T>() также можно создавать объекты Vector с фиксированной длиной, передав значение true для второго параметра (свойство fixed ). В этом случае экземпляр Vector создается с указанным числом элементов, которое нельзя изменить. Однако следует учесть, что при этом все равно можно изменять значения элементов объекта Vector с фиксированной длиной.

Использование конструктора Vector с буквенным синтаксисом

В Flash Professional CS5 и более поздних версиях, Flash Builder 4 и более поздних версиях, а также в Flex 4 и более поздних версиях можно передать список значений конструктору Vector.<T>() , чтобы задать начальные значения элементов экземпляра Vector:

// var v:Vector.<T> = new <T>[E0, ..., En-1 ,]; 
// For example: 
var v:Vector.<int> = new <int>[0,1,2,];

К данному синтаксису относится следующая информация.

  • Запятую в конце ставить не обязательно.

  • Пустые элементы в массиве не поддерживаются; инструкция, такая как var v:Vector.<int> = new <int>[0,,2,] выдает ошибку компилятора.

  • Для экземпляра Vector нельзя задать длину по умолчанию. Его длина равна числу элементов в списке инициализации.

  • Для экземпляра Vector нельзя задать фиксированную длину. Вместо этого следует использовать свойство fixed .

  • Использование значений, не соответствующих заданному типу, может привести к ошибкам или потере данных. Например:
    var v:Vector.<int> = new <int>[4.2]; // compiler error when running in strict mode 
    trace(v[0]); //returns 4 when not running in strict mode

Использование глобальной функции Vector.<T>()

Помимо конструктора Vector.<T>() и конструкторов Vector с буквенным синтаксисом, для создания объекта Vector также можно использовать глобальную функцию Vector.<T>() . Глобальная функция Vector.<T>() представляет собой функцию преобразования. Вызывая глобальную функцию Vector.<T>() , нужно указать базовый тип объекта Vector, возвращаемого методом. В качестве аргумента передается один индексный массив (экземпляр Array или Vector). Затем метод возвращает объект Vector с заданным базовым типом, содержащий значения в аргументе исходного массива. В следующем коде показан синтаксис для вызова глобальной функции Vector.<T>() .

var friends:Vector.<String> = Vector.<String>(["Bob", "Larry", "Sarah"]);

Глобальная функция Vector.<T>() выполняет преобразования типа данных на двух уровнях. Во-первых, когда функции передается экземпляр Array, возвращается экземпляр Vector. Во-вторых, независимо от типа исходного массива (экземпляр Array или Vector) функция пытается преобразовать элементы исходного массива в значения базового типа. В ходе этого процесса используются стандартные правила преобразования типа данных ActionScript. Например, следующий код преобразует значения String исходного экземпляра Array в целые числа для полученного массива Vector. Десятичная часть первого значения ( "1.5" ) усекается, а нечисловое третье значение ( "Waffles" ) преобразуется в 0 в результате:

var numbers:Vector.<int> = Vector.<int>(["1.5", "17", "Waffles"]); 
trace(numbers); // output: 1,17,0

Если не удается преобразовать ни один из элементов, выдается ошибка.

Если при вызове глобальной функции Vector.<T>() элемент в исходном массиве является экземпляром подкласса указанного базового типа, этот элемент добавляется в полученный объект Vector (ошибка не выдается). Использование глобальной функции Vector.<T>() фактически является единственным способом преобразования объекта Vector с базовым типом T в Vector с базовым типом, который является суперклассом T .

Вставка элементов массива

Самым простым способом добавления элемента в индексный массив является использование оператора доступа к массиву ( [] ). Чтобы задать значение для элемента индексного массива, используйте имя объекта Array или Vector и индекс в левой части инструкции присвоения.

songTitles[5] = "Happy Birthday";

Если в объекте Array или Vector еще нет элемента с таким индексом, он создается и используется для сохранения нового значения. Если в данной позиции индекса уже существует значение, оно заменяется новым значением.

Объект Array позволяет создавать элементы в любой позиции индекса. А в объекте Vector, напротив, значение можно присваивать только существующему индекса или следующему за ним. Следующий доступный индекс соответствует свойству length объекта Vector. Самым безопасным способом добавления нового элемента в объект Vector является использование кода, подобного следующему:

myVector[myVector.length] = valueToAdd;

Три метода классов Array и Vector: push() , unshift() и splice() — позволяют вставлять элементы в индексный массив. Метод push() добавляет один или несколько элементов в конец массива. Иными словами, у последнего элемента, вставленного в массив с помощью метода push() , будет наибольший индекс. Метод unshift() вставляет один или более элементов в начало массива, при этом первый индекс всегда равен 0. Метод splice() вставляет любое число элементов по заданному индексу в массиве.

В следующем примере показаны все три метода. Массив с именем planets создается для хранения названий планет в порядке удаленности от Солнца. Сначала вызывается метод push() и создается первый элемент Mars . Затем вызывается метод unshift() и вставляет в начало массива элемент Mercury . Наконец, вызывается метод splice() и вставляет элементы Venus и Earth после Mercury и перед Mars . Первый аргумент, передаваемый методу splice() , — это целое число 1. Он указывает, что вставку необходимо производить после индекса 1. Второй аргумент, передаваемый методу splice() , — это целое число 0. Он указывает, что никакие элементы удалять не нужно. Наконец, третий и четвертый аргументы — Venus и Earth , передаваемые методу splice() , — это вставляемые элементы.

var planets:Array = new Array(); 
planets.push("Mars"); // array contents: Mars 
planets.unshift("Mercury"); // array contents: Mercury,Mars 
planets.splice(1, 0, "Venus", "Earth"); 
trace(planets); // array contents: Mercury,Venus,Earth,Mars

Методы push() и unshift() возвращают целое число без знака, обозначающее величину измененного массива. Когда для вставки элементов используется метод splice() , он возвращает пустой массив. Это может показаться странным, но с учетом богатых возможностей применений метода splice() это вполне оправданно. Метод splice() можно использовать не только для вставки элементов в массив, но и для их удаления из массива. Когда метод splice() используется для удаления элементов, он возвращает массив удаленных элементов.

Примечание. Если свойство fixed объекта Vector имеет значение true , общее число элементов в массиве нельзя изменить. Если попытаться добавить новый элемент в объект Vector с фиксированной длиной с помощью описанных здесь приемов, произойдет ошибка.

Получение значений и удаление элементов массива

Самый простой способ получить значение элемента индексного массива — использовать оператор доступа к массиву ( [] ). Чтобы получить значение для элемента индексного массива, используйте имя объекта Array или Vector и индекс в правой части инструкции присвоения.

var myFavoriteSong:String = songTitles[3];

Также можно попытаться получить значение из объекта Array или Vector, используя позицию индекса, в которой нет элемента. В этом случае объект Array возвращает значение undefined, а объект Vector выдает исключение RangeError.

Три метода классов Array и Vector: pop() , shift() и splice() — позволяют удалять элементы. Метод pop() удаляет элемент из конца массива. Иначе говоря, он удаляет элемент с наибольшим индексом. Метод shift() удаляет элемент из начала массива, т. е. каждый раз удаляется элемент с индексом 0. Метод splice() , который также может использоваться для вставки элементов, удаляет произвольное число элементов, начиная с индекса, заданного первым из передаваемых методу аргументов.

В примере ниже показано использование всех трех методов для удаления элементов из экземпляра Array. Массив Array с именем oceans создается для хранения названий океанов. Некоторые из названий в массиве — это озера, а не океаны, и их нужно удалить.

Во-первых, используем метод splice() для удаления элементов Aral и Superior и вставки элементов Atlantic и Indian . Первый аргумент, передаваемый методу splice() , — это целое число 2. Он указывает, что операцию необходимо начинать с третьего элемента в списке, т. е. элемента с индексом 2. Второй аргумент, 2, указывает, что нужно удалить два элемента. Остальные аргументы: Atlantic и Indian — это значения, которые нужно вставить после индекса 2.

Во-вторых, используем метод pop() для удаления последнего элемента массива — Huron . B-третьих, используем метод shift() для удаления первого элемента массива — Victoria .

var oceans:Array = ["Victoria", "Pacific", "Aral", "Superior", "Indian", "Huron"]; 
oceans.splice(2, 2, "Arctic", "Atlantic"); // replaces Aral and Superior 
oceans.pop(); // removes Huron 
oceans.shift(); // removes Victoria 
trace(oceans);// output: Pacific,Arctic,Atlantic,Indian

Методы pop() и shift() возвращают элемент, который был удален. Для объекта Array, типом данных возвращаемого значения является Object, так как массивы могут содержать данные любого типа. Для объекта Vector типом данных возвращаемого значения является его базовый класс. Метод splice() возвращает объект Array или Vector с удаленными значениями. Можно изменить пример с массивом oceans так, чтобы вызов метода splice() назначал возвращенный объект Array новой переменной Array, как показано ниже:

var lakes:Array = oceans.splice(2, 2, "Arctic", "Atlantic"); 
trace(lakes); // output: Aral,Superior

Вам может встретиться код, применяющий оператор delete к элементу объекта Array. Оператор delete задает элементу объекта Array значение undefined , но не удаляет его из массива. Например, в приведенном ниже коде оператор delete применяется к третьему элементу массива oceans , но длина объекта Array по-прежнему остается равной 5.

var oceans:Array = ["Arctic", "Pacific", "Victoria", "Indian", "Atlantic"]; 
delete oceans[2]; 
trace(oceans);// output: Arctic,Pacific,,Indian,Atlantic 
trace(oceans[2]); // output: undefined 
trace(oceans.length); // output: 5

Можно усечь экземпляр Array или Vector с помощью свойства length . Если задать свойству length индексного массива значение меньше текущей длины, массив будет усечен, и все элементы с индексами больше нового значения length минус 1 будут удалены. Например, если массив oceans отсортировать так, чтобы все нужные значения были в начале массива, то с помощью свойства length можно удалить записи в конце массива, как показано ниже:

var oceans:Array = ["Arctic", "Pacific", "Victoria", "Aral", "Superior"]; 
oceans.length = 2; 
trace(oceans); // output: Arctic,Pacific
Примечание. Если свойство fixed объекта Vector имеет значение true , общее число элементов в массиве нельзя изменить. Если попытаться удалить элемент или усечь экземпляр Vector с фиксированной длиной с помощью описанных здесь приемов, произойдет ошибка.

Сортировка массива

Существует три метода: reverse() , sort() и sortOn() , — позволяющих изменить порядок элементов в индексном массиве путем сортировки или задания обратного порядка. Все они изменяют имеющийся массив. В следующей таблице приводятся общие сведения об этих методах и их поведении для объектов Array и Vector.

Метод

Поведение Array

Поведение Vector

reverse()

Изменяет порядок элементов таким образом, что последний элемент становится первым, предпоследний — вторым и так далее.

То же, что для объекта Array

sort()

Позволяет сортировать элементы объекта Array разными предварительно определенными способами, например в алфавитном порядке или по номерам. Также можно задать пользовательский алгоритм сортировки

Сортирует элементы в соответствии с алгоритмом сортировки, определенным пользователем.

sortOn()

Позволяет сортировать объекты, которые имеют одно или несколько общих свойств, указав одно или более свойств в качестве критериев сортировки.

Не доступен для класса Vector

Метод reverse()

Метод reverse() не принимает никаких параметров и не возвращает значений, но позволяет переключать порядок массива с прямого на обратный. В следующем примере порядок океанов в массиве oceans меняется с прямого на обратный:

var oceans:Array = ["Arctic", "Atlantic", "Indian", "Pacific"]; 
oceans.reverse(); 
trace(oceans); // output: Pacific,Indian,Atlantic,Arctic

Базовая сортировка с помощью метода sort() (только для класса Array)

Для класса Array метод sort() меняет порядок элементов в массиве с помощью порядка сортировки по умолчанию . Порядок сортировки по умолчанию обладает определенными характеристиками. Они перечислены ниже.

  • Сортировка чувствительна к регистру, поэтому заглавные буквы всегда имеют приоритет перед строчными. Например, буква «D» предшествует букве «b».

  • Сортировка выполняется по возрастанию, т.е. символы с меньшей величиной кода (скажем, «A») предшествуют символам с большей (скажем, «B»).

  • Одинаковые значения располагаются друг за другом, но определенного порядка внутри них самих нет.

  • В основе сортировки лежат строки, так как элементы перед сравнением преобразуются в строки (например, 10 предшествует 3, потому что строка "1" имеет меньшую величину кода символа, чем "3" ).

Вам может потребоваться отсортировать массив без учета регистра или в порядке убывания, а может быть, массив содержит числа, которые вы хотите отсортировать по величине, а не в алфавитном порядке. У метода sort() класса Array есть параметр options , позволяющий изменять каждую из характеристик порядка сортировки по умолчанию. Характеристики определяются набором статических переменных в классе Array, как показано ниже.

  • Array.CASEINSENSITIVE отменяет чувствительность к регистру. В этом случае, например, строчная буква «b» будет предшествовать заглавной «D».

  • Array.DESCENDING изменяет возрастающий порядок сортировки по умолчанию на убывающий. Например, буква «В» предшествует букве «А».

  • Array.UNIQUESORT останавливает сортировку, если обнаруживаются два одинаковых значения.

  • Array.NUMERIC позволяет выполнять сортировку чисел по величине так, чтобы число 3 стояло перед числом 10.

В примере ниже некоторые из этих параметров освещены подробнее. Создается объект Array с именем poets , который сортируется с помощью нескольких разных параметров.

var poets:Array = ["Blake", "cummings", "Angelou", "Dante"]; 
poets.sort(); // default sort 
trace(poets); // output: Angelou,Blake,Dante,cummings 
 
poets.sort(Array.CASEINSENSITIVE); 
trace(poets); // output: Angelou,Blake,cummings,Dante 
 
poets.sort(Array.DESCENDING); 
trace(poets); // output: cummings,Dante,Blake,Angelou 
 
poets.sort(Array.DESCENDING | Array.CASEINSENSITIVE); // use two options 
trace(poets); // output: Dante,cummings,Blake,Angelou

Пользовательская сортировка с помощью метода sort() (для классов Array и Vector)

Помимо базовой сортировки, доступной для объектов Array, также можно определить пользовательское правило сортировки. Этот прием является единственной формой использования метода sort() для класса Vector. Чтобы определить собственный порядок сортировки, нужно написать пользовательскую функцию сортировки и передать ее в качестве аргумента методу sort() .

Например, если у вас есть список имен, каждый из элементов которого состоит из имени и фамилии, а вы хотите отсортировать его по фамилиям, используйте собственную функцию сортировки для разбора каждого элемента и выполнения сортировки по фамилии. В примере ниже показано, как это сделать с помощью собственной функции, которая является параметром метода Array.sort() :

var names:Array = new Array("John Q. Smith", "Jane Doe", "Mike Jones"); 
function orderLastName(a, b):int 
{ 
    var lastName:RegExp = /\b\S+$/; 
    var name1 = a.match(lastName); 
    var name2 = b.match(lastName); 
    if (name1 < name2) 
    { 
        return -1; 
    } 
    else if (name1 > name2) 
    { 
        return 1; 
    } 
    else 
    { 
        return 0; 
    } 
} 
trace(names); // output: John Q. Smith,Jane Doe,Mike Jones 
names.sort(orderLastName); 
trace(names); // output: Jane Doe,Mike Jones,John Q. Smith

Персонализированная функция сортировки orderLastName() использует регулярное выражение для извлечения фамилии из каждого элемента и сравнения значений по фамилиям. Идентификатор функции orderLastName используется как самостоятельный параметр при вызове метода sort() в массиве names . Функция сортировки принимает два параметра, a и b , потому что она обрабатывает два элемента одновременно. Значение, возвращаемое функцией сортировки, указывает, каким образом сортировать элементы:

  • Возвращенное значение -1 означает, что первый параметр ( a ) стоит перед вторым ( b ).

  • Возвращенное значение 1 указывает, что второй параметр ( b ) стоит перед первым ( a ).

  • Возвращенное значение 0 говорит о том, что элементы равны в контексте сортировки.

Метод sortOn() (только для класса Array)

Метод sortOn() разработан для объектов Array с элементами, содержащими объекты. У этих объектов должно быть хотя бы одно общее свойство, которое можно использовать в качестве ключа сортировки. Использование метода sortOn() в массивах любого другого типа возвращает непредсказуемые результаты.

Примечание. Класс Vector не имеет метода sortOn() . Он доступен только для объектов Array.

В примере ниже объект Array с именем poets преобразуется, и каждый элемент превращается из строки в объект. Каждый объект содержит фамилию поэта и год его рождения.

var poets:Array = new Array(); 
poets.push({name:"Angelou", born:"1928"}); 
poets.push({name:"Blake", born:"1757"}); 
poets.push({name:"cummings", born:"1894"}); 
poets.push({name:"Dante", born:"1265"}); 
poets.push({name:"Wang", born:"701"});

Метод sortOn() можно использовать для сортировки объекта Array по свойству born . Метод sortOn() определяет два параметра: fieldName и options . Аргумент fieldName должен быть строкой. В примере ниже вызывается метод sortOn() с двумя аргументами — "born" и Array.NUMERIC . Аргумент Array.NUMERIC используется для гарантии того, что сортировка выполняется по величине чисел, а не по алфавиту. Следует придерживаться этого способа, даже если все числа одного порядка, потому что, если добавятся числа меньшего или большего порядков, вы будете точно знать, что сортировка будет выполняться правильно.

poets.sortOn("born", Array.NUMERIC); 
for (var i:int = 0; i < poets.length; ++i) 
{ 
    trace(poets[i].name, poets[i].born); 
} 
/* output: 
Wang 701 
Dante 1265 
Blake 1757 
cummings 1894 
Angelou 1928 
*/

Сортировка без изменения исходного массива (только для класса Array)

Как правило, методы sort() и sortOn() вносят изменения в объект Array. Если требуется выполнить сортировку без изменения существующего объекта Array, передайте константу Array.RETURNINDEXEDARRAY как часть параметра options . Этот параметр указывает методам, что нужно возвратить новый объект Array с сортировкой и оставить существующий массив без изменений. Методы возвращают простой массив индексов, отражающий новый порядок сортировки и не содержащий элементов исходного объекта Array. Например, для сортировки массива poets по году рождения без изменения самого объекта Array константа Array.RETURNINDEXEDARRAY включается как часть аргумента, передаваемого для параметра options .

В примере ниже возвращенная информация об индексах сохраняется в объекте Array с именем indices , а затем массив indices используется вместе с исходным массивом poets , чтобы вывести имена поэтов в порядке их годов рождения.

var indices:Array; 
indices = poets.sortOn("born", Array.NUMERIC | Array.RETURNINDEXEDARRAY); 
for (var i:int = 0; i < indices.length; ++i) 
{ 
    var index:int = indices[i]; 
    trace(poets[index].name, poets[index].born); 
} 
/* output: 
Wang 701 
Dante 1265 
Blake 1757 
cummings 1894 
Angelou 1928 
*/

Запросы в массив

Четыре метода классов Array и Vector: concat() , join() , slice() , toString() — отправляют запросы в массив, но не изменяют его. Методы concat() и slice() возвращают новые массивы, а методы join() и toString() возвращают строки. Метод concat() принимает в качестве аргументов новый массив или список элементов и совмещает его с предыдущим массивом для создания нового. У метода slice() есть два параметра с говорящими названиями startIndex и endIndex . Этот метод возвращает новый массив, содержащий копии элементов, «вырезанных» из существующего массива. Вырезаемый фрагмент начинается с элемента с индексом startIndex и заканчивается перед элементом endIndex . Еще раз отметим, что элемент с индексом endIndex не включается в возвращаемые значения.

В следующем примере методы concat() и slice() используются для создания новых массивов с помощью элементов других массивов:

var array1:Array = ["alpha", "beta"]; 
var array2:Array = array1.concat("gamma", "delta"); 
trace(array2); // output: alpha,beta,gamma,delta 
 
var array3:Array = array1.concat(array2); 
trace(array3); // output: alpha,beta,alpha,beta,gamma,delta 
 
var array4:Array = array3.slice(2,5); 
trace(array4); // output: alpha,beta,gamma

Методы join() и toString() можно использовать для отправки запросов в массив и возвращения его содержимого в виде строки. Если в методе join() не используются никакие параметры, оба метода ведут себя одинаково и возвращают строку, содержащую все элементы массива, разделенные запятыми. Метод join() , в отличие от метода toString() , принимает параметр delimiter , позволяющий выбрать знак для отделения элементов возвращаемой строки друг от друга.

В примере ниже создается объект Array с именем rivers , затем вызываются методы join() и toString() для возвращения значений массива в виде строки. Метод toString() возвращает значения, разделенные запятой ( riverCSV ), в то время как метод join() возвращает значения, разделенные знаком + .

var rivers:Array = ["Nile", "Amazon", "Yangtze", "Mississippi"]; 
var riverCSV:String = rivers.toString(); 
trace(riverCSV); // output: Nile,Amazon,Yangtze,Mississippi 
var riverPSV:String = rivers.join("+"); 
trace(riverPSV); // output: Nile+Amazon+Yangtze+Mississippi

При работе с методом join() необходимо помнить, что он всегда возвращает вложенные экземпляры Array или Vector со значениями, разделенными запятой, вне зависимости от того, какой разделительный знак вы задали для основных элементов массива. Это проиллюстрировано в примере:

var nested:Array = ["b","c","d"]; 
var letters:Array = ["a",nested,"e"];  
var joined:String = letters.join("+"); 
trace(joined); // output: a+b,c,d+e