Вам бонус- начислено 1 монета за дневную активность. Сейчас у вас 1 монета

Массивы в js: методы кратко

Лекция



Привет, сегодня поговорим про массивы в js, обещаю рассказать все что знаю. Для того чтобы лучше понимать что такое массивы в js , настоятельно рекомендую прочитать все из категории Выполнение скриптов на стороне клиента JavaScript, jqvery, JS фреймворки (Frontend).

  1. Object.keys(obj)
  2. Метод split
  3. Метод join
  4. Удаление из массива
  5. Метод splice
  6. Метод slice
  7. Сортировка, метод sort(fn)
    1. Свой порядок сортировки
  8. reverse
  9. concat
  10. indexOf/lastIndexOf

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

В этой главе мы рассмотрим встроенные методы массивов JavaScript.

Object.keys(obj)

В JavaScript есть встроенный метод Object.keys(obj), который возвращает ключи объекта в виде массива. Он поддерживается везде, кроме IE<9:

1 var user = {
2 name: "Петя",
3 age: 30
4 }
5
6 var keys = Object.keys(user);
7
8 alert(keys); // name, age

В более старых браузерах аналогом будет цикл:

var keys = [];
for(var key in user) keys.push(key);

Важность: 3

Пусть strings — массив строк.

Напишите функцию unique(strings), которая возвращает массив, содержащий только уникальные элементы arr.

Например:

1 function unique(arr) {
2 /* ваш код */
3 }
4
5 var strings = ["кришна", "кришна", "харе", "харе",
6 "харе", "харе", "кришна", "кришна", "8-()"];
7
8 alert( unique(strings) ); // кришна, харе, 8-()

Решение
Решение перебором (медленное)

Пройдем по массиву вложенным циклом.

Для каждого элемента мы будем искать, был ли такой уже. Если был — игнорировать:

01 function unique(arr) {
02 var obj = {};
03 var result = [];
04
05 nextInput:
06 for(var i=0; i
07 var str = arr[i]; // для каждого элемента
08 for(var j=0; j// ищем, был ли он уже?
09 if (result[j] == str) continue nextInput; // если да, то следующий
10 }
11 result.push(str);
12 }
13
14 return result;
15 }
16
17 var strings = ["кришна", "кришна", "харе", "харе",
18 "харе", "харе", "кришна", "кришна", "8-()"];
19
20 alert( unique(strings) ); // кришна, харе, 8-()

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

Предположим, в массиве 100 элементов. Об этом говорит сайт https://intellect.icu . Если все они одинаковые, то result будет состоять из одного элемента и вложенный цикл будет выполняться сразу. В этом случае все хорошо.

А если все, или почти все элементы разные?

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

    1. Для первого элемента — это обойдется в 0 операций доступа к элементамresult (он пока пустой).
    2. Для второго элемента — это обойдется в 1 операцию доступа к элементамresult.
    3. Для третьего элемента — это обойдется в 2 операции доступа к элементамresult.
    4. …Для n-го элемента — это обойдется в n-1 операций доступа к элементамresult.

Всего 0 + 1 + 2 + ... + n-1 = (n-1)*n/2 = n2/2 - n/2 (как сумма арифметической прогрессии), то есть количество операций растет примерно как квадрат от n.

Это очень быстрый рост. Для 100 элементов — 4950 операций, для 1000499500 (по формуле выше).

Поэтому такое решение подойдет только для небольших массивов. Вместо вложенного for можно использовать и arr.indexOf, ситуация от этого не поменяется, так как indexOf тоже ищет перебором.

Решение с объектом (быстрое)

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

Например, если "харе" попало в объект один раз (obj["харе"] = true), то второе такое же присваивание ничего не изменит.

Решение ниже создает объект obj = {} и записывает в него все строки как имена свойств. А затем собирает свойства из объекта в массив через for..in. Дубликатов уже не будет.

01 function unique(arr) {
02 var obj = {};
03
04 for(var i=0; i
05 var str = arr[i];
06 obj[str] = true; // запомнить строку в виде свойства объекта
07 }
08
09 return Object.keys(obj); // или собрать ключи перебором для IE<9
10 }
11
12 var strings = ["кришна", "кришна", "харе", "харе",
13 "харе", "харе", "кришна", "кришна", "8-()"];
14
15 alert( unique(strings) ); // кришна, харе, 8-()

Так что можно положить все значения как ключи в объект, а потом достать.

[Открыть задачу в новом окне]

Метод split

Ситуация из реальной жизни. Мы пишем сервис отсылки сообщений и посетитель вводит имена тех, кому его отправить: Маша, Петя, Марина, Василий.... Но нам-то гораздо удобнее работать с массивом имен, чем с одной строкой.

К счастью, есть метод split(s), который позволяет превратить строку в массив, разбив ее по разделителю s. В примере ниже таким разделителем является строка из запятой и пробела.

1 var names = 'Маша, Петя, Марина, Василий';
2
3 var arr = names.split(', ');
4
5 for (var i=0; i
6 alert('Вам сообщение ' + arr[i]);
7 }

Второй аргумент split

У метода split есть необязательный второй аргумент — ограничение на количество элементов в массиве. Если их больше, чем указано — остаток массива будет отброшен:

1 alert( "a,b,c,d".split(',', 2) ); // a,b
На практике он используется редко.

Разбивка по буквам

Вызов str.split('') разобьет строку на буквы:

1 var str = "тест";
2
3 alert( str.split('') ); // т,е,с,т

Метод join

Вызов arr.join(str) делает в точности противоположное split. Он берет массив и склеивает его в строку, используя str как разделитель.

Например:

1 var arr = ['Маша', 'Петя', 'Марина', 'Василий'];
2
3 var str = arr.join(';');
4
5 alert(str); // Маша;Петя;Марина;Василий

new Array + join = Повторение строки

Код для повторения строки 3 раза:

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

Как видно, new Array(4) делает массив без элементов длины 4, который joinобъединяет в строку, вставляя между его элементами строку "ля".

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

Важность: 5

В объекте есть свойство className, которое содержит список «классов» - слов, разделенных пробелом:

var obj = {
className: 'open menu'
}

Создайте функцию addClass(obj, cls), которая добавляет в список класс cls, но только если его там еще нет:

1 addClass(obj, 'new'); // obj.className='open menu new'
2 addClass(obj, 'open'); // без изменений (класс уже существует)
3 addClass(obj, 'me'); // obj.className='open menu new me'
4
5 alert(obj.className); // "open menu new me"

P.S. Ваша функция не должна добавлять лишних пробелов.

Решение

Решение заключается в превращении obj.className в массив при помощи split.
После этого в нем можно проверить наличие класса, и если нет - добавить.

01 function addClass(obj, cls) {
02 var classes = obj.className ? obj.className.split(' ') : [];
03
04 for(var i=0; i
05 if (classes[i] == cls) return; // класс уже есть
06 }
07
08 classes.push(cls); // добавить
09
10 obj.className = classes.join(' '); // и обновить свойство
11 }
12
13 var obj = { className: 'open menu' };
14
15 addClass(obj, 'new');
16 addClass(obj, 'open');
17 addClass(obj, 'me');
18 alert(obj.className) // open menu new me

P.S. «Альтернативный» подход к проверке наличия класса вызовомobj.className.indexOf(cls) был бы неверным. В частности, он найдетcls = "menu" в строке классов obj.className = "open mymenu".

P.P.S. Проверьте, нет ли в вашем решении присвоенияobj.className += " " + cls. Не добавляет ли оно лишний пробел в случае, если изначально obj.className = ""?

[Открыть задачу в новом окне]

Важность: 3

Напишите функцию camelize(str), которая преобразует строки вида «my-short-string» в «myShortString».

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

Например:

camelize("background-color") == 'backgroundColor';
camelize("list-style-image") == 'listStyleImage';

Такая функция полезна при работе с CSS.

P.S. Вам пригодятся методы строк charAt, split и toUpperCase.

Решение
Идея

Задача может быть решена несколькими способами. Один из них — разбить строку по дефису str.split('-'), затем последовательно сконструировать новую.

Решение

Разобьем строку в массив, а затем преобразуем его элементы и сольем обратно:

01 function camelize(str) {
02 var arr = str.split('-');
03
04 for(var i=1; i
05 // преобразовать: первый символ с большой буквы
06 arr[i] = arr[i].charAt(0).toUpperCase() + arr[i].slice(1);
07 }
08
09 return arr.join('');
10 }

Вау!! 😲 Ты еще не читал? Это зря!

К сожалению, в одной статье не просто дать все знания про массивы в js. Но я - старался. Если ты проявишь интерес к раскрытию подробностей,я обязательно напишу продолжение! Надеюсь, что теперь ты понял что такое массивы в js и для чего все это нужно, а если не понял, или есть замечания, то не стесняйся, пиши или спрашивай в комментариях, с удовольствием отвечу. Для того чтобы глубже понять настоятельно рекомендую изучить всю информацию из категории Выполнение скриптов на стороне клиента JavaScript, jqvery, JS фреймворки (Frontend)

создано: 2014-10-07
обновлено: 2021-12-05
132500



Рейтиг 9 of 10. count vote: 2
Вы довольны ?:


Поделиться:

Найди готовое или заработай

С нашими удобными сервисами без комиссии*

Как это работает? | Узнать цену?

Найти исполнителя
$0 / весь год.
  • У вас есть задание, но нет времени его делать
  • Вы хотите найти профессионала для выплнения задания
  • Возможно примерение функции гаранта на сделку
  • Приорететная поддержка
  • идеально подходит для студентов, у которых нет времени для решения заданий
Готовое решение
$0 / весь год.
  • Вы можите продать(исполнителем) или купить(заказчиком) готовое решение
  • Вам предоставят готовое решение
  • Будет предоставлено в минимальные сроки т.к. задание уже готовое
  • Вы получите базовую гарантию 8 дней
  • Вы можете заработать на материалах
  • подходит как для студентов так и для преподавателей
Я исполнитель
$0 / весь год.
  • Вы профессионал своего дела
  • У вас есть опыт и желание зарабатывать
  • Вы хотите помочь в решении задач или написании работ
  • Возможно примерение функции гаранта на сделку
  • подходит для опытных студентов так и для преподавателей



Комментарии


Оставить комментарий
Если у вас есть какое-либо предложение, идея, благодарность или комментарий, не стесняйтесь писать. Мы очень ценим отзывы и рады услышать ваше мнение.
To reply

Выполнение скриптов на стороне клиента JavaScript, jqvery, JS фреймворки (Frontend)

Термины: Выполнение скриптов на стороне клиента JavaScript, jqvery, JS фреймворки (Frontend)