В индексных массивах хранится последовательность из одного или более значений, организованных таким образом, чтобы каждое значение было доступно через целое число без знака. Первый индекс всегда равен 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
|
|
|