Интернет-технологии и распределённая обработка данных. Лекция 14

Содержание

Слайд 2

Массивы – общие сведения

Массив – разновидность объекта, которая предназначена для хранения пронумерованных

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

Слайд 3

Особенности массивов в JavaScript

1. Гетерогенные: элементы могут иметь разные типы.
2. Динамические: меняют

Особенности массивов в JavaScript 1. Гетерогенные: элементы могут иметь разные типы. 2.
размер по мере необходимости.
3. Разреженные: могут отсутствовать элементы с некоторыми индексами.
4. Это специальные объекты: числовые индексы работают как имена свойств. Обычно движки делают оптимизации: доступ по индексу выполняется быстрее, чем доступ к свойствам объектов.

Слайд 4

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

Способ 1: литерал массива.
var a = []; // пустой массив
var b =

Создание массива Способ 1: литерал массива. var a = []; // пустой
[1, 2 + 3]; // два элемента
var c = [1, "Pobot", [3]]; // три элемента
Запятая перед закрывающей скобкой игнорируется!
var d = [1, 2, 3, ]; // три элемента!

Слайд 5

Способ 2: функция Array() (вызывается с new или без):
Без аргументов – пустой

Способ 2: функция Array() (вызывается с new или без): Без аргументов –
массив длины 0
Одно число (целое неотрицательное, иначе RangeError) – массив указанной длины, без элементов
Один нечисловой аргумент – массив из этого элемента
Более одного аргумента – массив, который состоит из указанных элементов

Слайд 6

var a = new Array(); // => []
var b = new Array(2); // =>

var a = new Array(); // => [] var b = new
[ , ]
var c = new Array("Pobot"); // => [" Pobot "]
var d = new Array(1, "Pobot"); // => [1, " Pobot "]
var e = Array(1, " Pobot "); // => [1, " Pobot "]

Слайд 7

Доступ к элементам и индексы

Любой массив – это объект.
Любой объект – это

Доступ к элементам и индексы Любой массив – это объект. Любой объект
коллекция свойств и значений.
Любое свойство имеет имя.
Универсальное обращение к свойству: obj[name], где name автоматически приводится к string (а если имя свойства – это правильный идентификатор, то можно так: obj.name).

Слайд 9

Примеры показывают состав индексов массива:
var a = []; // индексов нет
a[0] = 10; //

Примеры показывают состав индексов массива: var a = []; // индексов нет
один индекс: 0
var x = a[1]; // один индекс: 0
var b = [1, ,3]; // два индекса: 0 и 2
delete b[0]; // один индекс: 2
b[2] = undefined; // один индекс: 2
var c = new Array(); // индексов нет
var d = new Array(2); // индексов нет!
var e = new Array(1, " Pobot "); // два индекса: 0 и 1

Слайд 10

Многомерные массивы

var matrix = [
[1, 2, 3],
[4, 5, 6],
[7,

Многомерные массивы var matrix = [ [1, 2, 3], [4, 5, 6],
8, 9]
];
alert( matrix[1][1] ); // центральный элемент

Слайд 11

Свойство length

Любой массив имеет свойство length.
Интуитивно: это «длина» массива, т.е. количество элементов

Свойство length Любой массив имеет свойство length. Интуитивно: это «длина» массива, т.е.
в нём. Но это справедливо только для плотных массивов – у разреженных свои нюансы!
Всегда верно: length будет больше максимального индекса массива (и почти всегда – ровно на 1).

Слайд 12

var a = []; // length = 0
a[0] = 10; // length = 1
a[10]

var a = []; // length = 0 a[0] = 10; //
= 100; // length = 11
delete a[10]; // length = 11
var b = [1, ,3]; // length = 3
b[2] = undefined; // length = 3
var c = new Array(2); // length = 2
c[0] = 10; // length = 2
// получить последний элемент
var lastItem = goods[goods.length - 1];
//добавить новый элемент
goods[goods.length] = 'Компьютер';

Слайд 13

Свойство length можно изменять. Уменьшение length приводит к «усечению» массива – исчезают

Свойство length можно изменять. Уменьшение length приводит к «усечению» массива – исчезают
элементы и индексы:
var a = [1, 2, 3];
a.length = 2; // у массива a индексы 0 и 1
При увеличении length не появляется ни новых элементов, ни новых индексов:
var b = [1, 2];
b.length = 3; // у массива b индексы 0 и 1

Слайд 14

Обход массива

var a = [10, 20, 30];
Обычно обход выполняется при помощи for:
for(var

Обход массива var a = [10, 20, 30]; Обычно обход выполняется при
i = 0; i < a.length; i++)
alert(a[i]);
(Микро)оптимизация:
for(var i = 0, len = a.length; i < len; i++)
alert(a[i]);

Слайд 15

Пропускаем несуществующие и undefined-элементы:
for(var i = 0; i < a.length; i++) {

Пропускаем несуществующие и undefined-элементы: for(var i = 0; i if (a[i] ===
if (a[i] === undefined) continue;
// тело цикла
}
Пропускаем только несуществующие элементы:
for(var i = 0; i < a.length; i++) {
if (!(i in a)) continue;
// тело цикла
}

Слайд 16

Для обхода «сильно» разреженного массива можно применить цикл for/in:
for(var index in sparseArray)

Для обхода «сильно» разреженного массива можно применить цикл for/in: for(var index in
{
var value = sparseArray[index];
// далее операции с индексами и значениями
}
Желательно задуматься о проверках, чтобы делать перебор только собственных свойств, которые одновременно являются индексами.(for..in выведет все свойства объекта, а не только цифровые)

Слайд 17

Методы массивов

Каждый массив обладает набором методов, изначально определённых в объекте Array.prototype.
Многие из

Методы массивов Каждый массив обладает набором методов, изначально определённых в объекте Array.prototype.
этих методов допускают косвенное применение к объектам, подобным массивам. Но некоторые методы меняют тот массив, у которого вызываются, а не все объекты, подобные массивам, допускают изменение (пример – строки).

Слайд 18

Преобразование массива в строку

join(separator) – вызывает у каждого элемента toString(), получившиеся

Преобразование массива в строку join(separator) – вызывает у каждого элемента toString(), получившиеся
результаты соединяет, используя указанную строку-разделитель (или запятую, если вызывается без аргумента);
toString() – аналог join(), вызванного без аргумента;
toLocaleString() – работает как toString(), но у каждого элемента вызывается toLocaleString();
valueOf() – аналог toString().

Слайд 19

Методы преобразования в строку перебирают индексы массива от 0 до length-1. Их

Методы преобразования в строку перебирают индексы массива от 0 до length-1. Их
не интересует фактическое наличие индекса!
var a = [1, , , , 5];
alert(a.join("+")); // выводит "1++++5"
var b = new Array(5);
alert(b.join("+")); // выводит "++++«
var monthNames = ['Янв', 'Фев', 'Мар', 'Апр'];
// присваивает 'Янв,Фев,Мар,Апр' переменной myVar
var myVar = monthNames.toString();

Слайд 20

var number = 1337;
var date = new Date();
var myArr

var number = 1337; var date = new Date(); var myArr =
= [number, date, 'foo'];
var str = myArr.toLocaleString(); console.log(str);
// напечатает '1337,6.12.2013 19:37:35,foo',
// если работает под германской локалью (de-DE) с //временной зоной Европа/Берлин

Слайд 21

Метод split

split(s) позволяет превратить строку в массив, разбив ее по разделителю s
var names

Метод split split(s) позволяет превратить строку в массив, разбив ее по разделителю
= 'Маша, Петя, Марина, Василий';
var arr = names.split(', '); //запятая и пробел - разделитель
for (var i = 0; i < arr.length; i++) {
alert( 'Вам сообщение ' + arr[i] );
}

Слайд 22

необязательный второй аргумент split – ограничение на количество элементов в массиве. Если

необязательный второй аргумент split – ограничение на количество элементов в массиве. Если
их больше, чем указано – остаток массива будет отброшен:
alert( "a,b,c,d".split(',', 2) ); // a,b
Вызов split с пустой строкой разобьёт по буквам:
var str = "тест";
alert( str.split('') ); // т,е,с,т

Слайд 23

Массив как стек

pop()
Удаляет последний элемент из массива и возвращает удалённое значение.
push(element1, ...,

Массив как стек pop() Удаляет последний элемент из массива и возвращает удалённое
elementN)
Добавляет элементы в конец массива и возвращает новую длину массива.

Слайд 24

var stack = [2, 3];
var popped = stack.pop();
// stack = [2], popped

var stack = [2, 3]; var popped = stack.pop(); // stack =
= 3
stack.push(8);
var total = stack.push(10, 12);
// stack = [2, 8, 10, 12], total = 4
// конкатенация массивов
Array.prototype.push.apply(stack, [-1, -2]);

Слайд 25

shift()
Удаляет и возвращает первый элемент массива, смещая последующие элементы к началу.
unshift(element1,...,elementN)
Добавляет элементы

shift() Удаляет и возвращает первый элемент массива, смещая последующие элементы к началу.
в начало массива (блоком) и возвращает новую длину массива.

Слайд 26

var queue = [2, 3];
var first = queue.shift();
// queue = [3], first

var queue = [2, 3]; var first = queue.shift(); // queue =
= 2
var total = queue.unshift(-1);
// queue = [-1, 3], total = 2
queue.unshift(10, 20);
// queue = [10, 20, -1, 3]

Слайд 28

fruits.shift();

fruits.pop();

fruits.shift(); fruits.pop();

Слайд 29

*var styles = ["Джаз", "Блюз"];
styles.push("Рок-н-Ролл");
styles[styles.length - 2] = "Классика";
alert( styles.shift() );
styles.unshift("Рэп", "Регги");
//вывод случайного

*var styles = ["Джаз", "Блюз"]; styles.push("Рок-н-Ролл"); styles[styles.length - 2] = "Классика"; alert(
значения из массива:
var arr = ["Яблоко", "Апельсин", "Груша", "Лимон"];
var rand = Math.floor(Math.random() * arr.length);
alert( arr[rand] );

Рэп,Регги,Классика,Рок-н-Ролл

Слайд 30

Изменение порядка элементов

reverse()
На месте обращает порядок следования элементов массива.
sort(compareFunction)
На месте сортирует массив

Изменение порядка элементов reverse() На месте обращает порядок следования элементов массива. sort(compareFunction)
по возрастанию. Может принимать функцию сравнения (без неё – сравнивается строковое представление элементов).

Слайд 31

var a = [1, 11, 2, -3];
a.sort(); // [-3, 1, 11, 2]
var arr

var a = [1, 11, 2, -3]; a.sort(); // [-3, 1, 11,
= [ 1, 2, 15 ]; 
arr.sort(); 
alert( arr ); // 1, 15, 2

Слайд 32

function compareNumeric(a, b) {
if (a > b) return 1;
if (a

function compareNumeric(a, b) { if (a > b) return 1; if (a
< b) return -1;
}
 var arr = [ 1, 2, 15 ];
 arr.sort(compareNumeric);
 alert(arr); // 1, 2, 15
// -1, если a меньше b
// 1, если a больше b
// 0, если a и b равны
a.sort(function(a, b) { return a - b; });
a.reverse(); // [11, 2, 1, -3]

Слайд 33

увидеть значения, с которыми sort вызывает функцию сравнения
[1, -2, 15, 2, 0, 8].sort(function(a,

увидеть значения, с которыми sort вызывает функцию сравнения [1, -2, 15, 2,
b) {
alert( a + " <> " + b );
}
);

Слайд 34

concat(elementOrArray1,...,elementOrArrayN)
Возвращает новый массив, состоящий из массива, на котором он был вызван, соединённого

concat(elementOrArray1,...,elementOrArrayN) Возвращает новый массив, состоящий из массива, на котором он был вызван,
с другими массивами и/или значениями, переданными в качестве аргументов.
Метод различает простые аргументы и аргументы-массивы (но без рекурсивной вложенности).

Слайд 35

var a = [1];
var b = a.concat(2, 3); // [1, 2, 3]
var c

var a = [1]; var b = a.concat(2, 3); // [1, 2,
= a.concat([2, 3]); // [1, 2, 3]
var d = a.concat([2, 3], 4, [5, 6]);
// [1, 2, 3, 4, 5, 6]
var e = a.concat([2, [3, 4]]); // [1, 2, 3, 4]

Слайд 36

var arr = [1, 2];
var newArr = arr.concat(arr,[3, 4], 5);
alert( newArr

var arr = [1, 2]; var newArr = arr.concat(arr,[3, 4], 5); alert( newArr ); // 1,2,1,2,3,4,5
);
// 1,2,1,2,3,4,5

Слайд 37

Если в качестве аргумента передать методу concat() разреженный массив, он будет присоединён

Если в качестве аргумента передать методу concat() разреженный массив, он будет присоединён
со всеми своими «дырами»:
var a = [1, 2, 3];
var b = a.concat([4, , , 7]);
// b = [1, 2, 3, 4, , , 7]
// индексы b = "0", "1", "2", "3", "6"

Слайд 38

slice(begin [,end])
Возвращает копию части массива в виде нового массива.
Возвращаются элементы с индексами

slice(begin [,end]) Возвращает копию части массива в виде нового массива. Возвращаются элементы
от begin до end, не включая end.
Если индексы отрицательные – отнимаем от длины.
Копировать весь массив: вызов slice() без аргументов.

Слайд 39

var a = [10, 20, 30, 40, 50];
var b = a.slice(1, 3); //

var a = [10, 20, 30, 40, 50]; var b = a.slice(1,
[20, 30]
var c = a.slice(1); // [20, 30, 40, 50]
var d = a.slice(3, 1); // []
var e = a.slice(-3, -1); // [30, 40]
var f = a.slice(); // [10, 20, 30, 40, 50]

Слайд 40

Метод slice() в разреженном массиве воспринимает последовательность индексов непрерывной:
var a = [1,

Метод slice() в разреженном массиве воспринимает последовательность индексов непрерывной: var a =
, , , , 6]; // здесь индексы "0" и "5"
var b = a.slice(2, 4);
//в b должны оказаться элементы с индексами"2" и "3"
// но их в a нет, и в b они не попадут
// т.е. в b нет ни индексов, ни элементов
// однако b.length = 2 (!!!)

Слайд 41

splice(start, deleteCount, [item1],...,[itemN])
Удалить deleteCount элементов, начиная с номера  start, а затем вставить item1, ..., itemN на

splice(start, deleteCount, [item1],...,[itemN]) Удалить deleteCount элементов, начиная с номера start, а затем
их место.
// начиная с позиции 1, удалить 1 элемент
arr.splice(1, 1);
Изменяет содержимое массива, удаляя существующие элементы и/или добавляя новые.
Если start отрицателен – отнимаем от длины.
Возвращаемое значение: массив, содержащий удалённые элементы.

Слайд 42

var a = [10, 20, 30, 40, 50];
var b = a.splice(1, 3);
//

var a = [10, 20, 30, 40, 50]; var b = a.splice(1,
a=[10, 50], b=[20, 30, 40]
var c = a.splice(1, 0, 20, 30, 40);
// a=[10, 20, 30, 40, 50], c=[]
var d = a.splice(1, 1, -1);
// a=[10, -1, 30, 40, 50], d=[20]
var e = a.splice(-1, 1, -1);
// a=[10, -1, 30, 40, -1], e=[50]

Слайд 43

Метод splice() в разреженном массиве ведёт себя подобно методу slice() (считает последовательность

Метод splice() в разреженном массиве ведёт себя подобно методу slice() (считает последовательность
индексов непрерывной):
// a: индексы "0" и "4", a[0]=1, a[4]=5, длина = 5
var a = [1, , , , 5];
var b = a.splice(1, 2);
// b: длина = 2, индексов нет
alert(b.length);
for(x in b)
alert(x);
// a: индексы "0" и "2", a[0]=1, a[2]=5, длина = 3

Слайд 44

var arr = [1, 2, 5] ;
// начиная с позиции индексом -1

var arr = [1, 2, 5] ; // начиная с позиции индексом
(перед последним //элементом) удалить 0 элементов,
// затем вставить числа 3 и 4
arr.splice(-1, 0, 3, 4);
alert( arr ); // результат: 1,2,3,4,5

Слайд 45

Поиск элементов

indexOf(element [,startIndex])
lastIndexOf(element [,startIndex])
Методы ищут указанный элемент в массиве и возвращают первую

Поиск элементов indexOf(element [,startIndex]) lastIndexOf(element [,startIndex]) Методы ищут указанный элемент в массиве
позицию элемента или -1.
Первый ищет от начала массива (или от указанной позиции) к концу, второй – от конца (или от указанной позиции) к началу.
 полный перебор, аналогичный циклу for
Для поиска используется строгое сравнение ===.

Слайд 46

var arr = [1, 0, false];
alert( arr.indexOf(0) ); // 1
alert( arr.indexOf(false) );

var arr = [1, 0, false]; alert( arr.indexOf(0) ); // 1 alert(
// 2
alert( arr.indexOf(null) ); //-1

Слайд 47

Поиск с проверкой поддержки браузером метода indexOf

// создаем пустой массив и проверяем поддерживается

Поиск с проверкой поддержки браузером метода indexOf // создаем пустой массив и
ли //indexOf
if ([].indexOf) {
var find = function(array, value) {
return array.indexOf(value); }
} else {
var find = function(array, value) {
for (var i = 0; i < array.length; i++) {
if (array[i] === value) return i; }
return -1; } }

Слайд 48

Object.keys(obj)

Позволяет работать со свойствами в виде массива
var user = {
name: "Петя",

Object.keys(obj) Позволяет работать со свойствами в виде массива var user = {
age: 30
}
 var keys = Object.keys(user);
 alert( keys ); // name, age

Слайд 49

Массив ‒ это объект, в функцию он передаётся по ссылке:

function eat(arr) {

Массив ‒ это объект, в функцию он передаётся по ссылке: function eat(arr)
arr.pop();
}
var arr = ["нам", "не", "страшен", "серый", "волк"];
alert( arr.length ); // 5
eat(arr);
eat(arr);
alert( arr.length );
// 3, в функцию массив не скопирован, а передана ссылка

Слайд 50

можно присваивать в массив любые свойства:

var fruits = []; // создать массив

можно присваивать в массив любые свойства: var fruits = []; // создать

fruits[99999] = 5; // присвоить свойство с любым номером
fruits.age = 25; // назначить свойство со строковым именем
//не рекомендуется

Слайд 51

var arr = [1, 2, 3];
var arr2 = arr;
arr2[0] =

var arr = [1, 2, 3]; var arr2 = arr; arr2[0] =
5;
//результат?
alert( arr[0] );
alert( arr2[0] );

5
5

Слайд 52

arr2 == arr
  true
var arr2 = [];
for (var i = 0; i

arr2 == arr true var arr2 = []; for (var i =
< arr.length; i++)
arr2[i] = arr[i];

1,2,3

Слайд 53

alert( new Array(4).join("ля") );
ляляля

alert( new Array(4).join("ля") ); ляляля

Слайд 54

Методы перебора элементов

Эти пять методов появились в ECMAScript 5. Методы принимают функцию

Методы перебора элементов Эти пять методов появились в ECMAScript 5. Методы принимают
f(), выполняемую для каждого элемента массива:
every() – возвращает true, если f() вернула true для каждого элемента;
some() – возвращает true, если f() вернула true хотя бы для одного элемента;
filter() – возвращает массив элементов, для которых f() вернула true;
map() – возвращает массив с результатами вызова f();
forEach() – просто выполняет f() для каждого элемента;

Слайд 55

var arr = [1, -1, 2, -2, 3];
function isPositive(number) {
return

var arr = [1, -1, 2, -2, 3]; function isPositive(number) { return
number > 0;
}
alert( arr.every(isPositive) ); // false, не все положительные
// true, есть хоть одно положительное
alert( arr.some(isPositive) );

Слайд 56

var arr = ["Яблоко", "Апельсин", "Груша"];
arr.forEach(function(item, i, arr) {
alert(

var arr = ["Яблоко", "Апельсин", "Груша"]; arr.forEach(function(item, i, arr) { alert( i
i + ": " + item + " (массив:" + arr + ")" );
});
item – очередной элемент массива.
i – его номер.
arr – массив, который перебирается.
0: Яблоко (массив:Яблоко,Апельсин,Груша)
1: Апельсин (массив:Яблоко,Апельсин,Груша)
2: Груша (массив:Яблоко,Апельсин,Груша)

Слайд 57


var names = ['HTML', 'CSS', 'JavaScript'];
var nameLengths = names.map(function(name) {

var names = ['HTML', 'CSS', 'JavaScript']; var nameLengths = names.map(function(name) { return
return name.length;
});
// получили массив с длинами
alert( nameLengths ); // 4,3,10

Слайд 58

var a = [1, 2, -3, 4, 5];
var all = a.every(function(x){ return

var a = [1, 2, -3, 4, 5]; var all = a.every(function(x){
x > 0;});//false
var any = a.some(function(x){ return x < 0;}); // true
var where = a.filter(function(x){ return x > 0;});
// where = [1, 2, 4, 5]
where.map(function(x){ return x * 10;}).forEach(alert);
// выводит "10", "20", "40", "50"

Слайд 59

Редукция элементов

reduce(callback [,initialValue])
reduceRight(callback [,initialValue])
Методы (ECMAScript 5) формируют из массива скалярное значение при

Редукция элементов reduce(callback [,initialValue]) reduceRight(callback [,initialValue]) Методы (ECMAScript 5) формируют из массива
помощи функции-аккумулятора (сохр. промежуточный рез-т).
Эта функция с четырьмя аргументами: последний результат вызова функции, он же «промежуточный результат», текущий элемент, текущий индекс, исходный массив. Функция возвращает новое значение аккумулятора.

Слайд 60

Если есть начальное значение ‒ initialValue, то на первом вызове значение аккумулятора будет равно initialValue,

Если есть начальное значение ‒ initialValue, то на первом вызове значение аккумулятора
а если у reduce нет второго аргумента, то оно равно первому элементу массива, а перебор начинается со второго.

Слайд 61

var arr = [1, 2, 3, 4, 5]
// для каждого элемента

var arr = [1, 2, 3, 4, 5] // для каждого элемента
массива запустить функцию,
// промежуточный результат передавать первым аргументом далее
var result = arr.reduce(function(sum, current) {
return sum + current;
}, 0);
alert( result ); // 15

Слайд 62

var sum = function(prev, cur, index, arr){
return prev + cur;};
var res =

var sum = function(prev, cur, index, arr){ return prev + cur;}; var
[1, 2, -3, 4, 5].reduce(sum);
// res = 9
var flat = [[0, 1], [2, 3], [4, 5]].reduce(function(a, b) {
return a.concat(b);
});
// flat = [0, 1, 2, 3, 4, 5]
flat = [[0, 1], [2, 3], [4, 5]].reduceRight(function(a, b) {
return a.concat(b);
}, [6]);
// flat = [6, 4, 5, 2, 3, 0, 1]

Слайд 63

Проверка на массив

Array.isArray(obj)
Этот статический метод поверяет, является ли obj массивом, и возвращает

Проверка на массив Array.isArray(obj) Этот статический метод поверяет, является ли obj массивом,
true или false.
Метод появился в ECMAScript 5.

Слайд 64

Сводная таблица методов и свойств

Сводная таблица методов и свойств

Слайд 65

Объекты, подобные массивам

Это объекты, обладающие индексами и свойством length. «Похожесть» на массивы

Объекты, подобные массивам Это объекты, обладающие индексами и свойством length. «Похожесть» на
позволяет применять к таким объектам многие методы массивов (если методу надо только length и индексы – всё будет ОК).
Примеры объектов, подобных массивам:
a) объект Arguments
b) строка (с поправкой на неизменяемость!)
Имя файла: Интернет-технологии-и-распределённая-обработка-данных.-Лекция-14.pptx
Количество просмотров: 42
Количество скачиваний: 0