Web #9 Объекты и массивы

Что такое массивы (списки)

Для хранения разных величин мы использовали переменные, например:
let number = 4;
let name = "Vasya";
let isAlive = true;

Для удобства и понимания мы представляли переменную в виде коробочки, у которой есть имя, в которой хранится какое-то значение:

Но часто бывают ситуации, когда нам необходимо хранить множество объектов и величин одного типа – наборы данных: например, список с противниками, список предметов в инвентаре, список всех лечилок или монеток, список фраз у NPC и т.п.
Для этого используются одномерные и многомерные массивы.

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

Рассмотрим пример одномерного массива: это массив, который называется enemies, содержащий список имён противников:

В javascript он объявляется так:
let enemies = ["John", "Jack", "Jane", "Rokko", "James", "Bill"];

Цифры от 0 до 5 называются индексами – это порядковый номер элемента в массиве. Для того, чтобы обратиться к какому-то элементу, указывается имя массива и его индекс в нём. Например:
console.log(enemies[0]); // Выведется John

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

Рассмотрим пример, когда у нас в фэнтези-игре есть 3 уровня и на каждом из них может выпадать тот или иной предмет из лута (инвентаря). Для этого используем многомерный массив loot с названиями этих предметов:
У этого массива есть 3 ряда по 4 элемента в каждом ряду.
Первый индекс означает номер ряда, второй – номер элемента в этом ряду. Объявляется такой массив таким образом:
let loot = [
                   ["Простой меч","Старый лук","Свиток молнии", "Мясо свинки"],
                   ["Святой щит","Колчан","Посох дедугана", "Суп из дракона"],
                   ["Шльом","Мегабронь","Борода Гэндальфа", "Слёзы единорога"]
];

console.log(loot[1][1]); // Выдаст "Колчан"

Объекты

Вместо числовых индексов в массивах можно использовать текстовые значения – ключи. Такие массивы называются ассоциативными или объектами. Рассмотрим объекты на примере противника:
У него есть свои свойства: координаты, скорость, количество жизней и урона, который он наносит и уникальный номер противника. При помощи объекта очень удобно обращаться со свойствами противника.
Объекты задаются так:
let enemy1 = {
    "x": 147,
    "y": 445,
    "speedX": 5,
    "speedY": -4,
    "hp": 100,
    "damage": 10,
    "id": 1
}

console.log(enemy1["x"]); // Выведется 147
console.log(enemy1.x); // Тоже выведется 147
Я предпочитаю использовать запись через точку enemy1.x

Try it out

1. Математические операции с элементами массива. 

Рассмотрим пример: за неделю было заработано определённое количество опыта. Эти данные записаны в виде массива. Нужно посчитать сумму полученного за неделю опыта.
1.1. Введём в программу данные:
let expa = [1035,467,0,2988,3586,4289,11087];

1.2. Сумму опыта будем хранить в переменной sumExpa:
let sumExpa = 0;

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

Количество повторений столько, сколько элементов в массиве, их можно узнать при помощи команды expa.length
for (let i=0;i<expa.length;i++) {
    sumExpa = sumExpa + expa[i]; // к старому значению sumExpa прибавляем значения из массива
}

1.4. В конце, после цикла выведем эту сумму:
alert("За неделю вы заработали " + sumExpa + " опыта");
Таким же образом можно совершать и другие математические операции над элементами массива.

2. Поиск в массиве по определённому критерию.

Найдём в массиве максимальное количество опыта и номер дня, в который он был заработан.
2.1. Продолжим предыдущую программу, добавим две новые переменные:
let sumExpa = 0;
let maxExpa = 0;
let dayMaxExpa = 0;

2.2. После вывода суммы из предыдущего примера добавим ещё один цикл. Пробежимся по массиву циклом, который будет работать так:
Если в этот день было больше опыта, чем в максимальном, тогда назначим новое максимальное значение и индекс этого дня запишем, как дня с максимальным опытом:
alert("За неделю вы заработали " + sumExpa + " опыта");

for (let i=0;i<expa.length;i++) {
    if (expa[i]>maxExpa) {
        maxExpa = expa[i];
        dayMaxExpa = i
    }
}

2.3. В конце, после этого цикла выведем информацию:
alert("Наибольшее количество опыта " + maxExpa  + " вы заработали на " + dayMaxExpa + " день");

В конспект

Индексы элементов массива в js начинаются с 0.

Объявление одномерного массива:

let enemies = ["John", "Jack", "Jane", "Rokko", "James", "Bill"];

Объявление двухмерного массива:

let loot = [
                   ["Простой меч","Старый лук","Свиток молнии", "Мясо свинки"],
                   ["Святой щит","Колчан","Посох дедугана", "Суп из дракона"],
];

Объявление объекта

let enemy1 = {
    "x": 147,
    "y": 445,
    "speedX": 5,
    "speedY": -4,
    "hp": 100,
    "damage": 10,
    "id": 1
}

Узнать количество элементов в массиве

array.length

Задачи

Задача 9.1*. Измените код из 2 пункта TryItOut: теперь нужно найти минимальное количество опыта и номер этого дня.

Задача 9.2*. Дополните предыдущую задачу, чтобы программа выводила не номер дня, а его название (например, понедельник, вторник и т.д.)

Задача 9.3*. Посчитать количество отрицательных элементов в массиве и вывести это число на экран. Пример массива:
[34,23,-569,-23,453,-3,0,34,-445,2,-3]

Задача 9.4*. Вывести все чётные числа массива на экран
[34,23,-569,-23,453,-3,0,34,-445,2,-3]

Задача 9.5***. Дан многомерный массив лута. Напишите программу, которыя выводит название лута: с вероятностью 50% выпадает лут первого уровня, 35% – второго уровня и 15% – третьего уровня.
let loot = [
                   ["Простой меч","Старый лук","Свиток молнии", "Мясо свинки"],
                   ["Святой щит","Колчан","Посох дедугана", "Суп из дракона"],
                   ["Шльом","Мегабронь","Борода Гэндальфа", "Слёзы единорога"]
];

Задача 9.6**. Генератор историй. Программа случайно выбирает по слову из массива и собирает из них историю по шаблону: "кто" и "кто" "когда" "что делали" и это закончилось тем, что "результат". Например: "Карлсон и Годзилла в расцвет Римской империи сдавали металлолом и это закончилось тем, что Стив Джобс презентовал iPhone".
Пример массива (можете собрать слова от однокурсников):
let who =  ["Карлсон","Дед Мороз","Терминатор"]
let when = ["в расцвет Римской империи","вчера","когда появился мир"]
// и так далее

Дополнительные задачи

Доп. задача 9.1*. Дан массив, состоящий из 15 элементов целого типа. Определить количество отрицательных, количество положительных и количество нулевых элементов.

Доп. задача 9.2*. Дан массив из 10 целых чисел. Посчитать сумму всех чисел массива.

Доп. задача 9.3*. Дан массив из 10 целых чисел. Найти индекс наибольшего из нечётных элементов массива.

Доп. задача 9.4*. Определить сумму и количество элементов, расположенных до первого отрицательного числа.

Доп. задача 9.5**. Определить максимальные элементы в двух массивах и поменять их местами.

Комментарии