Javascript урок 5. массивы, тип данных array
Содержание:
- More Examples
- Работа с массивами JS- сортировка, метод sort(fn)
- JS Tutorial
- Добавление элемента в конец массива (метод push() )
- Доступ к элементам массива
- More
- Работа с массивами JS — подробнее об определении массива
- Поговорим о главной задаче массивов
- Как извлечь часть массива
- Размер в байтах, который массив использует в памяти
- Перебор элементов массива
- JS Уроки
- Методы перебора элементов
- Обрезка массива ( метод slice() )
- Создание массива
- Строка
- Что такое массив?
- Добавление элемента в начало массива (метод unshift() )
- Работа с массивами JS — join и split
More Examples
Example
Find out how many <p> elements there are inside a <div> element:
var div = document.getElementById(«myDIV»); // Get the <div> element with id=»myDIV»var nodelist = div.getElementsByTagName(«P»).length; // Get the number of <p> elements inside <div>
Example
Loop through all <p> elements inside a <div> element, and change the background color of each <p>:
var div = document.getElementById(«myDIV»);var nodelist = div.getElementsByTagName(«P»);var i;for (i = 0; i < nodelist.length; i++) { nodelist.style.backgroundColor = «red»;}
Example
Return the number of child nodes of the <body> element:
var nodelist = document.body.childNodes.length;
Example
Loop through the child nodes of <body> and output the node name of each child node:
var nodelist = document.body.childNodes;var txt = «»;var i;for (i = 0; i < nodelist.length; i++) { txt = txt + nodelist.nodeName + «<br>»;}
Работа с массивами JS- сортировка, метод sort(fn)
Метод sort() сортирует массив, не изменяя количество элементов:
var arr = arr.sort() alert( arr ) // 1, 15, 2
Запустите приведенный выше код. Вы получите порядок 1, 15, 2. Это потому, что метод преобразует все в строку и использует по умолчанию лексикографический порядок.
Чтобы сделать метод «умнее», нам нужно передать в него пользовательскую функцию сравнения. Она должна принимать два аргумента и возвращать 1, 0 или -1:
function compare(a, b) { if (a > b) return 1 else if (a < b) return -1 else return 0 } var arr = arr.sort(compare) alert( arr ) // 1, 2, 15
Теперь все работает правильно.
Задание для самостоятельного выполнения
Создайте функцию ageSort(people) для сортировки массива объектов людей по возрасту:
var john = { name: "John Smith", age: 23 } var mary = { name: "Mary Key", age: 18 } var bob = { name: "Bob-small", age: 6 } var people = ageSort(people) // теперь люди должны быть отсортированы в таком порядке
Выведите имена людей после сортировки JavaScript двумерного массива.
Решение
Нужно использовать Array#sort и пользовательское сравнение:
function ageCompare(a, b) { if (a.age > b.age) return 1 else if (a.age < b.age) return -1 return 0 } function ageSort(people) { people.sort(ageCompare) } // проверьте это var john = { name: "John Smith", age: 23 } var mary = { name: "Mary Key", age: 18 } var bob = { name: "Bob-small", age: 6 } var people = ageSort(people) // проверьте порядок for(var i=0; i<people.length; i++) { alert(people.name) }
Более короткий вариант
Функция сравнения может быть короче. Альтернативное решение:
people.sort(function(a,b) { return a.age - b.age })
Оно работает, так как нам не нужно возвращать 1 / -1 / 0, будут работать положительные или отрицательные числа.
JS Tutorial
JS HOMEJS IntroductionJS Where ToJS OutputJS StatementsJS SyntaxJS CommentsJS VariablesJS LetJS ConstJS OperatorsJS ArithmeticJS AssignmentJS Data TypesJS FunctionsJS ObjectsJS EventsJS StringsJS String MethodsJS NumbersJS Number MethodsJS ArraysJS Array ConstJS Array MethodsJS Array SortJS Array IterationJS DatesJS Date FormatsJS Date Get MethodsJS Date Set MethodsJS MathJS RandomJS BooleansJS ComparisonsJS ConditionsJS SwitchJS Loop ForJS Loop For InJS Loop For OfJS Loop WhileJS BreakJS Type ConversionJS BitwiseJS RegExpJS ErrorsJS ScopeJS HoistingJS Strict ModeJS this KeywordJS Arrow FunctionJS ClassesJS JSONJS DebuggingJS Style GuideJS Best PracticesJS MistakesJS PerformanceJS Reserved Words
Добавление элемента в конец массива (метод push() )
Метод push():
- присоединяет элементы к концу массива, используядля определения места вставки свойство length;
- возвращает новое значение свойства length объекта, для которого был вызван данный метод.
Особенности метода push():
- Если свойство length не может быть преобразовано в число, будет использован индекс 0. Если свойство length не существует, то в этом случае оно будет создано.
- К строкам (как массивоподобным объектам) метод push() применён быть не может, так как строки являются неизменяемыми.
JavaScript
const numArray = ;
let value;
value = numArray.push(100); // добавление элемента в конец массива, переменная value принимает новое значение свойства length
console.log(value, numArray); // 6 Array(6)
1 |
constnumArray=12,45,67,456,34; let value; value=numArray.push(100);// добавление элемента в конец массива, переменная value принимает новое значение свойства length console.log(value,numArray);// 6 Array(6) |
Примеры
Доступ к элементам массива
К элементам массива можно обращаться по их индексу, используя обозначение в квадратных скобках. Индекс — это число, представляющее позицию элемента в массиве.
Индексы массива начинаются с нуля. Это означает, что первый элемент массива хранится с индексом 0, а не с 1, второй элемент хранится с индексом 1 и т.д. Индексы массива начинаются с 0 и доходят до значения количества элементов минус 1. Таким образом, массив из пяти элементов будет иметь индексы от 0 до 4.
В следующем примере показано, как получить отдельные элементы массива по их индексу.
var fruits = ; document.write(fruits); // Результат: Apple document.write(fruits); // Результат: Banana document.write(fruits); // Результат: Mango document.write(fruits); // Результат: Papaya
More
Fullscreen VideoModal BoxesDelete ModalTimelineScroll IndicatorProgress BarsSkill BarRange SlidersTooltipsDisplay Element HoverPopupsCollapsibleCalendarHTML IncludesTo Do ListLoadersStar RatingUser RatingOverlay EffectContact ChipsCardsFlip CardProfile CardProduct CardAlertsCalloutNotesLabelsCirclesStyle HRCouponList GroupList Without BulletsResponsive TextCutout TextGlowing TextFixed FooterSticky ElementEqual HeightClearfixResponsive FloatsSnackbarFullscreen WindowScroll DrawingSmooth ScrollGradient Bg ScrollSticky HeaderShrink Header on ScrollPricing TableParallaxAspect RatioResponsive IframesToggle Like/DislikeToggle Hide/ShowToggle Dark ModeToggle TextToggle ClassAdd ClassRemove ClassActive ClassTree ViewRemove PropertyOffline DetectionFind Hidden ElementRedirect WebpageZoom HoverFlip BoxCenter VerticallyCenter Button in DIVTransition on HoverArrowsShapesDownload LinkFull Height ElementBrowser WindowCustom ScrollbarHide ScrollbarShow/Force ScrollbarDevice LookContenteditable BorderPlaceholder ColorText Selection ColorBullet ColorVertical LineDividersAnimate IconsCountdown TimerTypewriterComing Soon PageChat MessagesPopup Chat WindowSplit ScreenTestimonialsSection CounterQuotes SlideshowClosable List ItemsTypical Device BreakpointsDraggable HTML ElementJS Media QueriesSyntax HighlighterJS AnimationsJS String LengthJS ExponentiationJS Default ParametersGet Current URLGet Current Screen SizeGet Iframe Elements
Работа с массивами JS — подробнее об определении массива
new Array()
В JavaScript объявление массива можно осуществить с помощью другого синтаксиса:
var arr = Array("Apple", "Peach", "etc")
Он используется редко только потому, что квадратные скобки [] короче.
Также существует вероятность того, что new Array, вызываемый с одним числовым аргументом, создаст массив заданной длины с неопределенными элементами:
var arr = new Array(2,3) // Ок, мы имеем arr = new Array(2) // получили ли мы ? alert(arr) // нет! мы получили
В приведенном выше примере мы получили undefined, потому что new Array(number) создает пустой массив с параметром length равным number.
Это может быть весьма неожиданно. Но если вы знаете об этой особенности, вы можете использовать new Array(number), например, так:
var indent = new Array(5).join('a') // aaaa (4 элемента)
Это оптимизированный способ повторить строку.
Многомерный массив JS
Массивы в JavaScript могут хранить любой тип данных:
var arr = alert(arr) // Small array
Это можно использовать для создания многомерных массивов:
var matrix = , , ] alert(matrix) // центральный элемент
Поговорим о главной задаче массивов
Они создаются при помощи квадратных скобок, обладают рядом возможностей и методов, а также могут быть многомерными. Главное их преимущество – все элементы пронумерованы, поэтому к ним можно обратиться через идентификатор.
Однако существует еще один вид массивов. На самом деле в статье, посвященной объектам, я рассказывал, что последние также являются массивами. И действительно, они представляют собой ассоциативные массивы, которые являются структурой данных с системой хранения информации в виде «ключ => значение». Такую структуру часто называют хэшем, реже словарем.
Разберем подробнее каждый вид.
Как извлечь часть массива
Если вы хотите извлечь часть массива (то есть подмассив), но оставить исходный массив без изменений, вы можете использовать метод slice(). Этот метод принимает 2 параметра: начальный индекс (индекс, с которого начинается извлечение) и необязательный конечный индекс (индекс, перед которым заканчивается извлечение), например arr.slice(startIndex, endIndex). Пример:
var fruits = ; var subarr = fruits.slice(1, 3); document.write(subarr); // Результат: Banana,Mango
Если параметр endIndex опущен — извлекаются все элементы до конца массива. Вы также можете указать отрицательные индексы или смещения — в этом случае метод slice() извлекает элементы из конца массива, а не из начала.
Размер в байтах, который массив использует в памяти
обычно используется в качестве решения предыдущего случая, но этот случай редко пишется безопасно, возможно потому, что он менее распространен.
Обычный способ получить это значение — использовать . Проблема: та же, что и с предыдущей; если у вас есть указатель вместо массива, ваша программа сойдет с ума.
Решение проблемы заключается в использовании того же макроса, что и раньше, который, как мы знаем, безопасен (он нарушает компиляцию, если применяется к указателю):
Как это работает, очень просто: оно отменяет деление, которое делает , поэтому после математических отмен вы получите только один , но с дополнительной безопасностью конструкции .
Пример использования:
нуждается в этом значении в качестве третьего аргумента.
Как и раньше, если массив получен как параметр (указатель), он не будет компилироваться, и нам придется заменить вызов макроса значением:
Перебор элементов массива
Один из распространенных
способов перебора элементов массива мы только что видели – это цикл for:
Например, для
массива:
let fruits = "Яблоко", "Апельсин", "Груша";
перебрать его
элементы можно так:
for(let i=;i < fruits.length; ++i) console.log( fruitsi );
мы увидим все
значения элементов. Но есть и второй новый способ перебора с помощью цикла for of:
for(let value of fruits) console.log( value );
Эта
запись короче, но имеет свои особенности: значения массива копируются в
переменную value, то есть,
внутри цикла мы имеем дело не с самими значениями массива fruits, а с их
копиями. Например, из-за этого мы не можем менять значения элементов массива
внутри такого цикла:
for(let value of fruits) { value = "none"; } console.log(fruits);
В консоле мы
увидим прежний массив. А вот через первый цикл так делать можно:
for(let i=;i < fruits.length; ++i) fruitsi = "none";
Преимуществом
цикла for of является его
оптимизация под массивы. В частности, он работает в 10-100 раз быстрее цикла for in, который мы
рассматривали ранее, для перебора свойств объекта. Формально, мы могли бы
использовать и его:
for(let key in fruits) console.log( fruitskey );
Но это будет
медленнее и к тому же там мы будем перебирать все публичные ключи массива, а не
только целочисленные, которые являются индексами элементов массива. В общем,
вывод такой. Нужно перебрать массив, используйте или обычный цикл for или цикл for of.
Видео по теме
JavaScipt #1: что это такое, с чего начать, как внедрять и запускать
JavaScipt #2: способы объявления переменных и констант в стандарте ES6+
JavaScript #3: примитивные типы number, string, Infinity, NaN, boolean, null, undefined, Symbol
JavaScript #4: приведение типов, оператор присваивания, функции alert, prompt, confirm
JavaScript #5: арифметические операции: +, -, *, /, **, %, ++, —
JavaScript #6: условные операторы if и switch, сравнение строк, строгое сравнение
JavaScript #7: операторы циклов for, while, do while, операторы break и continue
JavaScript #8: объявление функций по Function Declaration, аргументы по умолчанию
JavaScript #9: функции по Function Expression, анонимные функции, callback-функции
JavaScript #10: анонимные и стрелочные функции, функциональное выражение
JavaScript #11: объекты, цикл for in
JavaScript #12: методы объектов, ключевое слово this
JavaScript #13: клонирование объектов, функции конструкторы
JavaScript #14: массивы (array), методы push, pop, shift, unshift, многомерные массивы
JavaScript #15: методы массивов: splice, slice, indexOf, find, filter, forEach, sort, split, join
JavaScript #16: числовые методы toString, floor, ceil, round, random, parseInt и другие
JavaScript #17: методы строк — length, toLowerCase, indexOf, includes, startsWith, slice, substring
JavaScript #18: коллекции Map и Set
JavaScript #19: деструктурирующее присваивание
JavaScript #20: рекурсивные функции, остаточные аргументы, оператор расширения
JavaScript #21: замыкания, лексическое окружение, вложенные функции
JavaScript #22: свойства name, length и методы call, apply, bind функций
JavaScript #23: создание функций (new Function), функции setTimeout, setInterval и clearInterval
JS Уроки
JS HOMEJS IntroductionJS Where ToJS OutputJS StatementsJS SyntaxJS CommentsJS VariablesJS OperatorsJS ArithmeticJS AssignmentJS Data TypesJS FunctionsJS ObjectsJS ScopeJS EventsJS StringsJS String MethodsJS NumbersJS Number MethodsJS ArraysJS Array MethodsJS Array SortJS Array IterationJS DatesJS Date FormatsJS Date Get MethodsJS Date Set MethodsJS MathJS RandomJS BooleansJS ComparisonsJS ConditionsJS SwitchJS Loop ForJS Loop WhileJS BreakJS Type ConversionJS BitwiseJS RegExpJS ErrorsJS DebuggingJS HoistingJS Strict ModeJS this KeywordJS Style GuideJS Best PracticesJS MistakesJS PerformanceJS Reserved WordsJS VersionsJS Version ES5JS Version ES6JS JSON
Методы перебора элементов
1. Перебор элементов массива с помощью метода forEach().
Пример:
2. Метод map() проходится по элементам массива и как результат возвращает новый массив.
Пример:
3. Метод filter() предназначен для фильтрации массива через функцию. Данный метод вернет новый массив в зависимости от истинности выполненного условия для каждого элемента.
Пример:
4. Метод every() используется для проверки значений массива на равенство. Если при вызове колкэк-функции каждый элемент массива будет соответствовать условиям, то данный метод вернет true.
Пример:
5. Метод some() похож на метод every(), но при этом он отличается тем, что возвращает true, если при вызове колбэк-функции хотя бы один из элементов будет равен указанному условию.
Пример:
6. Метод reduce() позволяет обойти каждый элемент массива с возможностью сохранения промежуточного результата. Reduce() часто используется в качестве замены нескольких методов, которые потребовалось бы применить для достижения аналогичного результата.
Пример:
7. Метод reduceRight() работает так же как и reduce(), но идет по элементам массива справа налево.
Обрезка массива ( метод slice() )
Метод slice() возвращает новый массив, содержащий копию части исходного массива.
JavaScript
arr.slice(])
1 | arr.slice(begin,end) |
Параметры метода slice ():
-
begin (необязательный) — индекс, с которого начинается извлечение (отсчёт начинается с 0):
- если индекс отрицательный, begin указывает смещение от конца последовательности (т.е. вызов slice(-2) извлечёт два последних элемента последовательности);
- если begin не определен, slice() начинает работать с индекса 0;
- если begin больше длины последовательности — вернется пустой массив.
-
end (необязательный) — индекс (счёт начинается с нуля), по которому заканчивать извлечение. Метод slice() извлекает элементы с индексом меньше end (т.е. вызов slice(1, 4) извлечёт элементы со второго по четвёртый (элементы по индексам 1, 2 и 3):
- если индекс отрицательный, end указывает смещение от конца последовательности (т.е. вызов slice(2, -1) извлечёт из последовательности элементы начиная с третьего элемента с начала и заканчивая вторым с конца);
- если end опущен, slice() извлекает все элементы до конца последовательности (т.е. до arr.length).
Возвращаемое значение:
новый массив, содержащий извлеченные элементы.
Элементы исходного массива копируются в новый массив по следующим правилам:
JavaScript
var fruits = ;
var citrus = fruits.slice(1, 3); // citrus содержит
const numArray = ;
let value;
value = numArray.slice(0, 3); // обрезка массива (вернет с 0 по 3-й элемент)
console.log(value, numArray); // Array(3) Array(5)
1 |
varfruits=’Банан’,’Апельсин’,’Лимон’,’Яблоко’,’Манго’; varcitrus=fruits.slice(1,3);// citrus содержит constnumArray=12,45,67,456,34; let value; value=numArray.slice(,3);// обрезка массива (вернет с 0 по 3-й элемент) console.log(value,numArray);// Array(3) Array(5) |
Добавление и удаление элементов массива с определённым индексом ( Array.splice() )
JavaScript
var arr = ;
var val = arr.splice(0, 2);
console.log(val); // Array , т.е. вырезано 2 элемента. начиная с 0-го
console.log(arr); // Array — оставшиеся элементы массива
// ИЛИ
const numArray = ;
let value;
value = numArray.splice(0, 2, «one», «two»); // удаление 2-х элементов массива (с 0-го, 2 элемента добавляем)
console.log(value, numArray); // Array Array(5)
value = numArray.splice(1, 0, «AAA», «BBB»); // добавление элементов массива (с 1, добавляем 2 элемента)
console.log(value, numArray); // Array [] Array(7)
1 |
vararr=»Alex»,»Mary»,»Serg»; varval=arr.splice(,2); console.log(val);// Array , т.е. вырезано 2 элемента. начиная с 0-го console.log(arr);// Array — оставшиеся элементы массива constnumArray=12,45,67,456,34; let value; value=numArray.splice(,2,»one»,»two»);// удаление 2-х элементов массива (с 0-го, 2 элемента добавляем) console.log(value,numArray);// Array Array(5) value=numArray.splice(1,,»AAA»,»BBB»);// добавление элементов массива (с 1, добавляем 2 элемента) console.log(value,numArray);// Array [] Array(7) |
Создание массива
Массив (Array) – это упорядоченный набор пронумерованных значений. Каждое значение называется элементом массива, а номер элемента в массиве, называется его индексом. Так как JavaScript – это нетипизированный язык, элемент массива может иметь любой тип, причем разные элементы одного массива могут иметь разные типы. Элемент массива может быть даже объектом или другим массивом.
Объекты массивов могут создаваться путем присвоения переменным литеральных значений массивов либо при помощи оператора .
Литерально массив определяется перечислением значений в квадратных скобках . При этом значения разделяются запятыми и имеют целочисленный, последовательно возрастающий от нуля индекс:
Другой способ создания массива состоит в вызове конструктора . Вызывать конструктор можно тремя разными способами:
В первом случае создается пустой массив, эквивалентный литералу :
Во втором – массив с заданным количеством элементов (каждый из которых имеет значение undefined) и устанавливает свойство массива равным указанному значению:
Третий способ очень похож на определение массива с помощью литерала – аналогично создается массив, заполненный указанными значениями. Свойство массива устанавливается равным количеству элементов, переданных конструктору:
Когда конструктор вызывается как функция (без оператора ), он ведет себя точно так же, как при вызове с оператором :
Строка
Строка () в JavaScript должна быть заключена в кавычки.
В JavaScript существует три типа кавычек.
- Двойные кавычки: .
- Одинарные кавычки: .
- Обратные кавычки: .
Двойные или одинарные кавычки являются «простыми», между ними нет разницы в JavaScript.
Обратные же кавычки имеют расширенную функциональность. Они позволяют нам встраивать выражения в строку, заключая их в . Например:
Выражение внутри вычисляется, и его результат становится частью строки. Мы можем положить туда всё, что угодно: переменную , или выражение , или что-то более сложное.
Обратите внимание, что это можно делать только в обратных кавычках. Другие кавычки не имеют такой функциональности встраивания!. Мы рассмотрим строки более подробно в главе Строки
Мы рассмотрим строки более подробно в главе Строки.
Нет отдельного типа данных для одного символа.
В некоторых языках, например C и Java, для хранения одного символа, например или , существует отдельный тип. В языках C и Java это .
В JavaScript подобного типа нет, есть только тип . Строка может содержать ноль символов (быть пустой), один символ или множество.
Что такое массив?
Массив представляет собой коллекцию значений, которая хранится в одной переменной.
Если у вас есть список элементов (например, список названий смартфонов), хранение смартфонов в отдельных переменных может выглядеть следующим образом:
$smart1 = "Samsung"; $smart2 = "Huawei"; $smart3 = "Apple";
Но что, если вам нужно хранить названия городов в переменных, и на этот раз их будет не три, а сотни? Хранить названия городов в отдельных переменных не рационально и в этом случае вам и понадобится массив PHP.
После создания массива элементы можно добавлять, удалять и изменять, сортировать и многое другое. Элементы в массиве могут относиться к любому типу данных, а массив может содержать любую комбинацию типов данных — нет необходимости содержать каждый элемент в массиве одного типа.
Добавление элемента в начало массива (метод unshift() )
Метод unshift():
- добавляет элементы в начало массива;
- возвращает новое значение свойства length объекта, для которого был вызван данный метод.
const numberArray = ;
let value;
value = numberArray.unshift(200,100); // добавление элементов в начало массива, переменная value принимает новое значение свойства length
console.log(value, numberArray); // 7 Array (7)
// Ещё пример
const numArray = ;
numArray.unshift(); // добавление элементов в начало массива
console.log(numArray); // Array (2) , 10]
1 |
constnumberArray=12,45,67,456,34; let value; value=numberArray.unshift(200,100);// добавление элементов в начало массива, переменная value принимает новое значение свойства length console.log(value,numberArray);// 7 Array (7) constnumArray=10; numArray.unshift(-200);// добавление элементов в начало массива console.log(numArray);// Array (2) , 10] |
Работа с массивами JS — join и split
Иногда нужен быстрый способ преобразовать JavaScript массив в строку. Именно для этого предназначен метод join.
Он объединяет массив в строку, используя заданный разделитель:
var fruits = ; var str = fruits.join(', '); alert(str);
Обратное преобразование легко выполняется с помощью метода split:
var fruits = "Apple,Orange,Peach"; var arr = fruits.split(','); // arr содержит теперь alert(arr);
Задание для самостоятельного выполнения
Объект включает в себя свойство className, которое содержит имена классов, разделенные пробелами:
var obj = { className: 'open menu' }
Напишите функцию addClass(obj, cls), которая добавляет класс cls, но только если он не существует:
ddClass(obj, 'new') // obj.className='open menu new' addClass(obj, 'open') // без изменений (class already exists) addClass(obj, 'me') // obj.className='open menu new me' alert(obj.className) //
Решение
Нужно разделить className и цикл на части. Если класс не найден, тогда он добавляется.
Цикл немного оптимизирован для увеличения производительности:
function addClass(elem, cls) { for(var c = elem.className.split(' '), i=c.length-1; i>=0; i--) { if (c == cls) return } elem.className += ' '+cls } var obj = { className: 'open menu' } addClass(obj, 'new') addClass(obj, 'open') alert(obj.className) // open menu new
В приведенном выше примере переменная c определяется в начале цикла, и для ее последнего индекса задается значение i.
Сам цикл обрабатывается в обратном направлении, заканчиваясь условием i>=0. Потому что i>=0 проверить быстрее, чем i. Что в JavaScript ускоряет поиск в массиве.