Компьютерный журнал для новичков и профессионалов

Js вывод данных из многомерного массива. Многомерные массивы в javascript и несколько способов их сортировки. Методы класса Array

В предыдущей статье мы поговорили о том что такое и как с ним работать. В этой статье мы поговорим уже о многомерном массиве .

Это массив, у которого один или больше элементов, являются также массивами. В зависимости от глубины объявления, в частности он может называться двумерным массивом (2 уровня) либо трёхмерным массивом (3 уровня) либо четырехмерным (4 уровня) и так далее.

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


Как видите, элементы двумерного массива являются одномерные массивы. Если бы эти одномерные массивы содержали ещё массивы, то массив arr был бы уже трёхмерным.

Для примера давайте создадим три простых массивов и заполним их данными. Первого мы заполним чётными числами, второго заполним нечётными числами, а третьего какими-то произвольными данными.

//Объявляем три пустых массивов var evenNumbers = new Array(); //Переменная k - для индексов массива evenNumbers var k = 0; var oddNumbers = new Array(); //Переменная n - для индексов массива oddNumbers var n = 0; var data = new Array("car", "plane", true, 89, "m"); //Заполняем массив evenNumbers, с четными числами for(var i = 1; i

Для того чтобы посмотреть что находится внутри массива можно воспользоваться таким инструментом как console .

Например, мы хотим увидеть содержимое массива с нечётными числами oddNumbers. Для этого в коде ниже пишем такую строку:

Console.log(oddNumbers);

Чтобы увидеть результат, необходимо открыть консоль в браузере . В Google Chrome это делается так: нажимаем правый клик мыши на странице, и из контекстного меню выбираем последнею опцию “Просмотреть код”, то есть инспектор. В английской версии, эта опция называется Inspect.


И ниже появится панель инструментов разработчика. В ней необходимо перейти во вкладку Console(Консоль).


Теперь для того чтобы создать двумерный массив , необходимо объявить его, и добавить в нём одномерные массивы, которые создали выше.

//Объявляем двумерный массив twoDimens, и заполняем его var twoDimens = new Array(evenNumbers, oddNumbers, data); console.log(twoDimens);

Посмотрим в консоль содержимое данного массива.


перебор двумерного массива

Для начала научимся, как обратится к элементам двумерного массива .

Как и с одинарными массивами, обращение к элементам делается по их индексам.

Для примера давайте выведем на экран, элемент с индексом 3 из массива с нечётными числами(oddNumbers). Индекс одномерного массива oddNumbers в двумерном массиве twoDimens равен единице(1).

Document.write("Элемент с индексом 3 из массива нечётных чисел oddNumbers равен: " + twoDimens); // Элемент: 7

В массиве twoDimens мы обращаемся к элементу с индексом 1. Элемент, который находится под этим индексом, является массив oddNumbers. И в этом массиве мы уже обращаемся к элементу с индексом 3, который является числом 7.

Теперь приступим к самому вопросу как перебрать двумерный массив .

Перебор двумерного массива делается с помощью двойного цикла. Для примера, сделаем перебор нашего массива twoDimens.

For(var i = 0; i < twoDimens.length; i++){ for(var j = 0; j < twoDimens[i].length; j++){ document.write("

Элемент с индексом " + i + " " + j + " равен: " + twoDimens[i][j] + "

"); } }

В первом цикле мы делаем перебор самого массива twoDimens. Во втором цикле мы делаем уже перебор самого элемента (массива). Сначала, переменная i равна 0. Поэтому во втором цикле мы сначала делаем перебор первого массива evenNumbers, который имеет индекс 0. И уже внутри второго цикла мы обращаемся к элементам данного массива. Таким образом: twoDimens[j]. Где j меняется от 0 до длины массива evenNumbers.

После перебора элементов из первого массива, возвращаемся к первому циклу, инкрементируем переменную i, и переходим к перебору уже второго массива oddNumbers, который имеет индекс 1. И так вот делается перебор каждого элемента двумерного массива twoDimens.

Теперь посмотрим на результат данного перебора:


Вот и все, о чем хотел я рассказать в этой статье. Теперь Вы знаете, как создать двумерный массив, как обратится к элементам двумерного массива и как перебрать двумерный массив . Надеюсь, что всё было понятно. Желаю Вам больших успехов!

Последнее обновление: 09.04.2018

Для работы с наборами данных предназначены массивы. Для создания массива применяется выражение new Array() :

Var myArray = new Array();

Существует также более короткий способ инициализации массива:

Var myArray = ;

В данном случае мы создаем пустой массив. Но можно также добавить в него начальные данные:

Var people = ["Tom", "Alice", "Sam"]; console.log(people);

В этом случае в массиве myArray будет три элемента. Графически его можно представить так:

Для обращения к отдельным элементам массива используются индексы. Отсчет начинается с нуля, то есть первый элемент будет иметь индекс 0, а последний - 2:

Var people = ["Tom", "Alice", "Sam"]; console.log(people); // Tom var person3 = people; // Sam console.log(person3); // Sam

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

Var people = ["Tom", "Alice", "Sam"]; console.log(people); // undefined

Также по индексу осуществляется установка значений для элементов массива:

Var people = ["Tom", "Alice", "Sam"]; console.log(people); // Tom people = "Bob"; console.log(people); // Bob

Причем в отличие от других языков, как C# или Java, можно установить элемент, который изначально не установлен:

Var people = ["Tom", "Alice", "Sam"]; console.log(people); // undefined - в массиве только три элемента people = "Bob"; console.log(people); // Bob

Также стоит отметить, что в отличие от ряда языков программирования в JavaScript массивы не являются строго типизированными, один массив может хранить данные разных типов:

Var objects = ["Tom", 12, true, 3.14, false]; console.log(objects);

spread-оператор

spread-оператор ... позволяет взять значения из массива по отдельности:

Let numbers = ; console.log(...numbers); // 1 2 3 4 console.log(numbers); //

spread-оператор указывается перед массивом. В результате выражение...numbers возвратит набор чисел, но это будет не массив, а именно отедльные значения.

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

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

Var numbers1 = ; // одномерный массив var numbers2 = [, ]; // двумерный массив

Визуально оба массива можно представить следующим образом:

Одномерный массив numbers1

Чтобы получить отдельный элемент массива, также используется индекс:

Var tomInfo = people;

Только теперь переменная tomInfo будет представлять массив. Чтобы получить элемент внутри вложенного массива, нам надо использовать его вторую размерность:

Console.log("Имя: " + people); // Tom console.log("Возраст: " + people); // 25

То есть если визуально двумерный массив мы можем представить в виде таблицы, то элемент people будет ссылаться на ячейку таблицы, которая находится на пересечении первой строки и второго столбца (первая размерность - 0 - строка, вторая размерность - 1 - столбец).

Также мы можем выполнить присвоение:

Var people = [ ["Tom", 25, false], ["Bill", 38, true], ["Alice", 21, false] ]; people = 56; // присваиваем отдельное значение console.log(people); // 56 people = ["Bob", 29, false]; // присваиваем массив console.log(people); // Bob

При создании многомерных массивов мы не ограничены только двумерными, но также можем использовать массивы больших размерностей:

Var numbers = ; numbers = ; // теперь numbers - двумерный массив numbers=; // теперь numbers - трехмерный массив numbers = 5; // первый элемент трехмерного массива равен 5 console.log(numbers);

Всем доброго времени суток. На связи Алексей Гулынин. В прошлой статье мы разобрали конструкцию switch case в javascript . В данной статье я бы хотел рассказать, что такое массивы в Javascript . Понятие массива играет важную роль не только в Javascript, но и во всем программировании. Переменная, типа массив, содержит в себе не один элемент, а несколько. Синтаксис создания массива следующий:

Var mas = new Array(значение1, значение2,..., значениеN);

В данном случае создаётся переменная mas типа массив со значениями, указанными в скобках. Обращаю ваше внимание, что массив создаётся с помощью ключевого слова new. Обращаться к элементам массива можно, указав имя массива и в квадратных скобках индекс массива. Индекс массива задаётся с нуля. Давайте приведу пример массива, состоящего из 4 элементов и выведу 2 элемент:

var mas = new Array("privet", 1, 10, 5); document.write("Второй элемент массива = "+mas); // будет выведено число 10

Если мы поставим mas , то будет выведено "privet" , так как индексация массива начинается с нуля. Давайте теперь разберемся, как вывести все элементы массива. Для этого нужно воспользоваться циклом. Помимо знания циклов в Javascript , необходимо знать свойство массивов length , которое возвращает количество элементов массива (или по-другому его длину). Давайте выведем длину массива mas :

var mas = new Array("privet", 1, 10, 5); document.write("Длина массива = "+mas.length); // будет выведено число 4

Вывод всех элементов массива:

var mas = new Array("privet", 1, 10, 5); var i; for (i = 0; i < mas.length; i++) document.write(mas[i]+" ");

Пока что, мы с вами рассматривали одномерные массивы. Вообще массивы могут быть многомерными. Главное необходимо понимать, что, например двумерный массив — это массив элементами которого являются массивы. Давайте с вами разберем такую задачу: необходимо создать двумерный массив 3 на 3, элементы которого задаются пользователем и вывести этот массив. Здесь будем использовать оператор prompt для запроса числа у пользователя:

var mas = new Array(); //объявляем массив const n = 3; //объявляем константу, т.е. массив у нас размером 3 на 3 //для задания двумерного массива необходимо использовать двойной цикл var i; var j; for (i = 0; i < n; i++) { mas[i] = new Array();//Здесь мы как раз каждый элемент массива делаем массивом for (j = 0; j < n; j++) { mas[i][j] = prompt("[" + i +","+j+"]= " ,"..."); //запрашиваем число у пользователя } } for (i = 0; i < n; i++) { for (j = 0; j < n; j++) { document.write("[" + i +","+j+"]= "+ mas[i][j]);} //выводим элемент массива document.write("
"); //переход на новую строку после каждой заполненной строки массива }

В нашем случае двумерный массив соответствует (для примера) такой структуре: mas=[,,] . Видно, что у массива 3 элемента, каждый из которых является сам массивом.

Изначально задача Javascript’а была в том, чтобы делать динамические сайты. В своей практике я нигде не использовал двумерные массивы, только одномерные, так что тех знаний по массивам, которые вы получили из данной статьи, будет вполне достаточно. В одной из следующих статей я расскажу об объекте Array , его свойствах и методах.

В этой статье мы рассмотрим стандартные JavaScript массивы с числовыми индексами. Массивы объявляются с помощью квадратных скобок:

var fruits = ["Apple", "Orange", "Donkey"]

Чтобы извлечь элемент, поместите его индекс в квадратные скобки. Первый индекс 0 :

var fruits = ["Apple", "Orange", "Donkey"] alert(fruits) alert(fruits) alert(fruits)

Мы также можем получить длину массива JavaScript :

var fruits = ["Apple", "Orange", "Donkey"] alert(fruits.length)

Упс! Мы создали массив с двумя фруктами и ослом. Теперь нам нужно удалить осла.

Методы pop и push

Метод pop в JavaScript удаляет элемент массива и возвращает его.

В следующем примере показано, как «Осел » извлекается из массива:

var fruits = ["Apple", "Orange", "Donkey"] alert("Я удаляю "+fruits.pop()) // Теперь у нас только ["Apple","Orange"] alert("Теперь размер массива: "+fruits.length) // осел удален

Обратите внимание, что pop изменяет сам массив.

Аналог pop — это метод push , который добавляет элемент в массив. Например, мы забыли добавить персик:

var fruits = ["Apple", "Orange"] fruits.push("Peach"); // теперь у нас есть ["Apple", "Orange", "Peach"] alert("Последний элемент:"+fruits)

  • Создайте массив styles с элементами “Jazz ”, “Blues ”;
  • Добавьте значение «Rock’n’Roll «;
  • Замените второе значение с конца значением «Classic «. У вас должен получиться массив: “Jazz ”, ”Classic ”, ”Rock’n’Roll ”. Код должен работать для любой длины массива;
  • Извлеките последнее значение из массива и выведите его через alert .
  • Решение

    // 1 var styles = ["Jazz", "Bluez"] // 2 styles.push("Rock"n"Roll") // или: styles = "Rock"n"Roll" // 3 styles = "Classic" // 4 alert(styles.pop())

    Методы shift/unshift

    Методы shift/unshift работают с концом массива, но вы также можете использовать shift , чтобы сдвинуть элементы вверх (первое значение массива удаляется со сдвигом элементов ). Метод unshift позволяет в JavaScript добавить элемент в массив с конца:

    var fruits = ["Apple", "Orange"] var apple = fruits.shift() // теперь у нас остался только ["Orange"] fruits.unshift("Lemon") // теперь мы имеем ["Lemon", "Orange"] alert(fruits.length) // 2

    И shift , и unshift могут работать с несколькими элементами одновременно:

    var fruits = ["Apple"] fruits.push("Orange","Peach") fruits.unshift("Pineapple","Lemon") // теперь массив выглядит так: ["Pineapple", "Lemon", "Apple", "Orange", "Peach"]

    Задание для самостоятельного выполнения

    Напишите код, чтобы вывести через alert случайное значение из массива arr :

    var arr = ["Plum","Orange","Donkey","Carrot","JavaScript"]

    Примечание: Код для получения случайного числа от минимального до максимального значения (включительно ) следующий:

    var rand = min + Math.floor(Math.random()*(max+1-min))

    Решение

    Нам нужно извлечь случайное число от 0 до arr.length-1 (включительно ):

    var arr = ["Plum","Orange","Donkey","Carrot","JavaScript"] var rand = Math.floor(Math.random()*arr.length) alert(arr)

    Перебор массива

    В JavaScript перебор массива осуществляется с помощью цикла for :

    var fruits = ["Pineapple", "Lemon", "Apple", "Orange", "Peach"] for(var i=0; i=0 проверить быстрее, чем i . Что в JavaScript ускоряет поиск в массиве.

    Использование length для обрезки массива

    С помощью свойства length можно обрезать массив следующим образом:

    Вы задаете длину, и браузер обрезает массив.

    Array представляет собой объект, что из этого следует

    На самом деле в JavaScript Array — это Object , дополненный автоматической установкой длины и специальными методами.

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

    Нечисловые ключи массива

    Ключи — это числа, но они могут иметь любые имена:

    arr = arr = 5 arr.prop = 10 // не делайте так

    В JavaScript массивы представляют собой хэш-таблицы с их преимуществами в плане производительности, но и с определенными недостатками.

    Например, push/pop работают только с крайними элементами массива, поэтому они невероятно быстры.

    push работает только с концом:

    var arr = ["My", "array"] arr.push("something") alert(arr) // строка "array"

    Методы shift/unshift медленные, потому что им нужно изменить нумерацию всего массива. Метод splice также может привести к изменению нумерации:

    Таким образом, shift/unshift работают медленнее, чем push/pop . Чем больше массив, тем больше времени занимает в JavaScript сортировка массива.

    Задание для самостоятельного выполнения

    Какой получится результат? Почему?

    arr = ["a", "b"] arr.push(function() { alert(this) }) arr() // ?

    Решение

    Поскольку массивы являются объектами, arr.. фактически является вызовом метода объекта, таким как objmethod:

    arr() // то же самое что arr() // синтаксически это неправильно, но концептуально то же самое: arr.2() // переписанное в том же стиле, что и obj.method() this = arr в таком случае передается функции, поэтому выводится содержимое arr. arr = ["a", "b"] arr.push(function() { alert(this) }) arr() // "a","b",функция

    Разреженные массивы, описание length

    Свойство length позволяет получить не размер массива в JavaScript , а последний индекс + 1 . Это важно, если речь идет о разреженных массивах, с «промежутками » в индексах.

    В следующем примере мы добавим два элемента в пустые fruits , но значение length останется 100 :

    var fruits = // пустой массив fruits = "Peach" fruits = "Apple" alert(fruits.length) // 100 (но элементов в массиве всего 2)

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

    var fruits = // пустой массив fruits = "Peach" fruits = "Apple" alert(fruits) // ,Peach,Apple (или что-то вроде этого)

    Но массив — это объект с двумя ключами. Недостающие значения не занимают места.

    Разреженные массивы ведут себя причудливо, когда к ним применяются методы массива. Они понятия не имеют о том, что индексы пропущены:

    var fruits = fruits = "Peach" fruits = "Apple" alert(fruits.pop()) // выталкиваем "Apple" (на индекс 9) alert(fruits.pop()) // выталкиваем не заданный элемент (на индекс 8)

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

    Удаление из массива

    Как мы знаем, массивы — это объекты, поэтому мы могли бы использовать delete , чтобы удалить значение:

    var arr = ["Go", "to", "home"] delete arr // теперь arr = ["Go", undefined, "home"] alert(arr) // не задано

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

    Оператор delete удаляет пару ключ-значение, и это все. Естественно, так как массив — это только хэш, позиция удаленного элемента становится undefined .

    Чаще всего нам нужно удалить элемент, не оставляя «дыр » между индексами. Существует еще один метод, который поможет нам в этом.

    Метод splice

    Метод splice может удалять элементы и заменять их в JavaScript многомерных массивах. Его синтаксис:

    arr.splice(index, deleteCount[, elem1, ..., elemN])

    Удаляет элемент deleteCount , начиная с index , а затем вставляет на его место elem1, …, elemN .

    Давайте рассмотрим несколько примеров:

    var arr = ["Go", "to", "home"] arr.splice(1, 1) // удалить 1 элемент, начиная с индекса 1 alert(arr.join(",")) // ["Go", "home"] (1 элемент удален)

    Таким образом, вы можете использовать splice , чтобы удалить один элемент из массива. Номера элементов массива сдвигаются, чтобы заполнить пробел:

    var arr = ["Go", "to", "home"] arr.splice(0, 1) // удаляем 1 элемент, начиная с индекса 0 alert(arr) // "to" стал первым элементом

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

    Метод splice возвращает массив удаленных элементов:

    var arr = ["Go", "to", "home", "now"]; // удаляем 2 первых элемента var removed = arr.splice(0, 2) alert(removed) // "Go", "to" =0; i--) { if (c[i] == cls) c.splice(i,1) } elem.className = c.join(" ") } var obj = { className: "open menu" } removeClass(obj, "open") removeClass(obj, "blabla") alert(obj.className) // menu

    В приведенном выше примере переменная c задана в начале цикла, и для i задан ее последний индекс.

    Сам цикл выполняется в обратном направлении, заканчиваясь условием i>=0 . Это сделано потому, что i>=0 проверяется быстрее, чем i . Что ускоряет поиск свойства в c .

    Метод slice

    Можно извлечь часть массива с помощью метода slice(begin[, end]): var arr = ["Why", "learn", "JavaScript"]; var arr2 = arr.slice(0,2) // принимает 2 элемента, начиная с 0 alert(arr2.join(", ")) // "Why, learn"

    Обратите внимание, что этот метод не изменяет в JavaScript количество элементов в массиве, а копирует его часть.

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

    var arr = ["Why", "learn", "JavaScript"]; var arr2 = arr.slice(1) // принимает все элементы, начиная с 1 alert(arr2.join(", ")) // "learn, JavaScript"

    Метод поддерживает отрицательные индексы, так же, как String#slice .

    Метод reverse

    Еще один полезный метод — reverse . Предположим, я хочу получить последнюю часть домена, например, “com ” от “my.site.com ”. Вот как это можно сделать:

    var domain = "my.site.com" var last = domain.split(".").reverse() alert(last)

    Обратите внимание, что JavaScript массивы поддерживают сложный синтаксис (reverse()) для вызова метода, а затем извлечения элемента из полученного массива.

    Вы можете создавать более длинные вызовы, например, reverse()0] arr.sort() alert(arr) // 1, 15, 2

    Запустите приведенный выше код. Вы получите порядок 1 , 15 , 2 . Это потому, что метод преобразует все в строку и использует по умолчанию лексикографический порядок.

    Приветствую всех, кто заинтересовался такой темой, как JavaScript многомерные массивы и сортировка. В текущей публикации я постараюсь во всех подробностях раскрыть данную тему.

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

    Как создаются многомерные массивы и для чего они нужны?

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

    var array =

    А теперь запомните, что многомерный массив – это массив массивов. Соглашусь, звучит, как тавтология. Однако прочитайте определение еще раз. Действительно, многомерный массив состоит из определенного количества вложенных в него .

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

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

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

    var results = [ ["Маркус", 333], ["Наташа", 211], ["Алексей", 124] ];

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

    При этом обращение к элементам происходит через двойной оператор .

    Для закрепления материала проанализируйте небольшую программку.

    Значение results =

    var results = [ ["Маркус", 333], ["Наташа", 211], ["Алексей", 124] ]; document.getElementById("demo").innerHTML = results;

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

    Способы сортировки данных

    Для массивов в JavaScript-е предусмотрен встроенный метод под названием sort () . Данный инструмент очень гибок. И сейчас объясню почему.

    Если вы используете метод без параметров, то он автоматически упорядочивает подмассивы по первому элементу в алфавитном порядке. Так, при вызове results. sort () разбираемый объект будет выглядеть вот так:

    Алексей,124

    Маркус,333

    Наташа,211

    А если поменять в каждом вложенном массиве элементы местами, то получится:

    124,Алексей

    211,Наташа

    333,Маркус

    При этом для сравнения все элементы временно преобразовываются к строкам.

    Если же для решения какой-то конкретной задачи вам необходима функция, сортирующая элементы нестандартным способом, то вы можете написать ее самостоятельно и передать в качестве параметра в sort () . При этом стоит учесть, что пользовательская функция должна возвращать:

    • положительное число (в основном выбирают 1), если первый указанный элемент следует за вторым при сравнении;
    • отрицательное число (обычно -1), если второй выбранный элемент должен следовать за первым;
    • нуль, если два проверяемых значения равны.

    В качестве примера давайте первоначальный массив results отсортируем по очкам. При чем результаты будут упорядочены от большего к меньшему. Это можно реализовать двумя способами.

    В первом варианте я изменил логику сортировки, т.е. в ситуации, когда надо возвращать положительное число, возвращаю отрицательное и наоборот.

    Рекордная таблица:

    var results = [ ["Маркус", 333], ["Наташа", 211], ["Алексей", 124] ]; results.sort(RecordSort); function RecordSort(a, b) { if (a > b) return -1; else if (a < b) return 1; else return 0; } for(var i=0; i b) return 1; else if (a < b) return -1; else return 0; }

    function RecordSort(a, b) { if (a > b) return 1; else if (a < b) return -1; else return 0; }

    А вот после нее добавим указанный выше метод.

    Вывод производится аналогичным образом.

    Хочу обратить ваше внимание на один важный момент. При использовании данных функций все изменения происходят с массивом, к которому вы их применяете. Таким образом, если вам необходимо сохранить первоначальный вид данных, то создавайте копию, а после редактируйте уже ее.

    Ну, вот я и рассказал о многомерных массивах и их сортировке. Если вам понравилась статья, то подписывайтесь на блог и читайте другие не менее интересные публикации. Буду благодарен за репосты. До новых встреч!

    Пока-пока!

    С уважением, Роман Чуешов

    Загрузка...