Рубрики
Без рубрики

Не соглашайтесь: как вы можете сопоставить свою коллекцию JavaScript к своим целям

Джо Морган не соглашайтесь: как вы можете сопоставить свою коллекцию JavaScript для вашего голли любимого JavaScript, даже когда мир ненавидел его. Но у меня всегда было трудно оправдание коллекций. Объекты своего рода клавиш-магазин, но не на самом деле. И они были ужасны, если вам нужно

Автор оригинала: FreeCodeCamp Community Member.

Джо Морган

Я любил JavaScript, даже когда мир ненавидел его. Но у меня всегда было трудно оправдание коллекций. Объекты своего рода клавиш-магазин, но не на самом деле. И они были ужасны, если вам нужно отсортировать или петлю. Массивы были проще в курсе, но неуклюже, если вам нужно было вытащить определенное значение без индекса.

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

Было больно.

Вещи сейчас отличаются. Есть больше типов сбора. Есть больше методов. Есть лучшие методы и даже однострочные выражения для переключения между типами коллекции. Почему тогда кажется, что мы все еще просто догадываемся, когда мы выбираем тип коллекции?

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

Время закончить это. У нас не только есть массивы и объекты. У нас также есть карты, наборы, слабые карты и слабые.

Так что вы должны выбрать? Каждая коллекция имеет взлеты и падения. Но в целом есть три больших фактора, которые должны влиять на ваш выбор:

  • ИТЕРИТЕЛЬНО : Можете ли вы зацикливаться через коллекцию напрямую и получить доступ к каждому участнику одновременно?
  • Раскрытый : Можете ли вы найти значение, используя специальный ключ, не беспокоясь о других участниках коллекции?
  • Разрушимый : Можете ли вы быстро и легко потянуть кусочки коллекции в переменные?

Каждый тип коллекции силен в некоторых областях и слабых в других. Есть и другие преимущества и недостатки, но это большие три для большинства кода.

Массива

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

Вот список учителей моей классной школы (имена изменены для защиты невинного).

const myTeachers = ['Cooper', 'Simes', 'Butler'];

Массивы сохраняют порядок, который велик, поскольку это правильный порядок моего первого, второго и преподавателей третьего класса. Поскольку заказ имеет смысл, и я должен знать смысл, я могу использовать Разрушение вытащить предметы в переменные.

const [firstGrade, secondGrade, ...others] = myTeachers.

Разрушение – это быстрый способ вытащить информацию из коллекции в отдельные переменные. Это также может создавать подмножество информации. Переменная первый класс имеет значение Купер Отказ Следующая переменная, SecondGrade это СМЕС Отказ Последняя переменная немного отличается, используя три точки ... Мы сохраняем остальные переменные, один в этом случае, как отдельный массив. Это означает другие Также массив: [«Батлер»] Отказ В этом случае ... это шаблон отдыха. Мы сохраняем остальные значения в конце концов.

Вернуться к моей коллекции учителей. Допустим, вам не волнует заказ, которого они научили меня, вы больше заинтересованы в алфавитном списке. Теперь, прежде чем вы сортировать массив, помните, сортировка – это мутационная функция, поэтому действие изменит исходный массив. И поскольку приказ имеет значение, вы не хотите делать постоянные изменения. К счастью, это не большая проблема, так как вы можете создать новый массив с оператором SPRECT: [... MyTheachers] Отказ

Причина, по которой вы можете использовать оператор спреда, заключается в том, что массивы имеют встроенный итератор который позволяет действовать на сборе один за раз. Другими словами, массивы считать . Оператор распространения принимает эти предметы и создает новый список по одному. Положить все в квадратные скобки создает новый массив. Имея недвижимость также то, что позволяет вам делать хорошие вещи, такие как цикл, используя для ... из или запустить функцию на каждом элементе массива, поскольку вы будете делать с .map и .Расмейте методы.

Вернуться к сортировке. Теперь, когда вы можете сделать новый массив, вам не нужно беспокоиться о мутациях. Функция сортировки – одноклассник.

const sortedTeachers = [...myTeachers].sort();

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

export const myTeacherPairs = [['first', 'Cooper'], ['second', 'Simes'], ['third', 'Butler']];
return teachers.find(teacherPair => teacherPair[0] === 'second');

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

Проблемы состоят в том, что коллекция не ключ Отказ Массивы хороши в большом количестве вещей, но магазины ключей не являются одним. Так что вы находитесь в привязке. Вам нравятся деструктурные свойства и итерасле. Но извлечение информации о значении ключей не просто. Это обычно, когда разработчики обращаются к объектам. Но до этого здесь краткое изложение массивов:

✅ Деструктурируемый

✅ Считать

❌ ключ

Объекты

Большинство разработчиков JavaScript инстинктивно достигают для объекта, как только им нужно хранить пары ключа-значений. Объекты в JavaScript могут получить довольно сложный комплекс. Ради этого примера думайте о них как простым способом передачи данных вокруг. Нет функций. Нет это ключевое слово. Просто пары ключа-значений.

Начните, переписывая мой массив учителей в объект:

const teachers = {  first: "Cooper",  second: "Simes",  third: "Butler",};

Если вам нужно было найти только у своего учителя второго класса и не заботился о других частях объекта, вы можете вытащить его напрямую: преподаватели . Даже лучше, вы можете потянуть значение непосредственно в переменную с разрушением. Это простое задание, если переменная соответствует клавише объекта.

const { second } = teachers;

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

function getSecondGradeInfo({ second }) {  const school = "Lakin";  return {    school,    teacher: second  }}

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

Object.keys(teachers).map(grade => `${grade}:${teachers[grade]}`).join(' ');
let myTeacher = '';for(const grade in teachers) {  myTeacher += ` ${grade}:${teachers[grade]}`;}

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

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

Кроме того, есть и другие проблемы с объектами. Есть ограниченные ключевые варианты. Вы не можете использовать Числа как ключи, например. Они не так исполнительные средства как другие коллекции. Но по большей части они хороши для передачи данных без большого количества петель.

Обобщить:

✅ Деструктурируемый

❌ Считать

✅ ключ

Карта

Карты – это новый тип коллекции для JavaScript. Они являются правильным магазином Key-value. Который просто способ сказать, что они были разработаны специально для этой цели. В отличие от объектов, вы все равно должны явно создать новый экземпляр:

const teachers = new Map();

После этого вы устанавливаете каждый элемент, передав ключ, затем значение в качестве аргументов.

teachers.set('first', 'Cooper').set('second', 'Simes').set('third', 'Butler);

Чтобы получить значение, вы называете Получить () Способ вместе с ключевым именем.

teachers.get('second'); // Simes

Это может выглядеть немного знакомым уже. Это не сильно отличается от LocalStorage.SetItem (ключ, значение Который вы, возможно, использовали для хранения данных между посещениями веб-пансиона.

В качестве магазинов клавишных значений карты довольно велики. Они берут более широкую Разнообразие ключей Отказ И хотя время поиска объектов является линейным, время поиска карты будет Логарифмический Отказ

Но самое большое преимущество состоит в том, что у них есть встроенная. Это означает, что вы можете делать такие вещи, как пары ключей доступ к ключам напрямую:

let myTeachers = '';for([grade, name] of teachers) {  myTeachers += ` ${grade}:${name}`;}

Несколько вещей, которые говорят об этом. Это может выглядеть так, как будто вы разрушили карту в начале цикла. Вы на самом деле нет. Когда вы повторяете на карте, вы вернетесь в пару с ключом и значением. Так что вы на самом деле разрушаете массив.

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

[...teachers]

станет

[  ['first', 'Cooper'],  ['second', 'Simes'],  ['third', 'Butler'],]

С картой преобразована в массив, теперь вы можете сопоставить элементы для создания вашей строки.

[...teachers].map(([grade, name]) => `${grade}:${name}`).join();

Это означает, что у вас есть доступ ко всем методам массива в трех коротких символах.

Ох, и так как он является несомненным, порядок сохраняется. Если вы добавите своего учителя первого класса в начале, вы получите его в начале.

Так какие недостатки? Самым большим является отсутствие прямого разрушения. Вы не можете вытащить значение без звонка Получить () метод или путем преобразования в массив. Это означает, что передача данных между функциями становится маленьким вершией. Вы также не можете представлять карты как json String. Таким образом, вы не будете тянуть карты от API в любое время в ближайшее время.

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

Обобщить:

❌ Деструктурируемый

✅ Считать

✅ ключ

Двигаться между

Вы, наверное, заметил один расстраивающий шаблон. Там нет ни одной коллекции, которая может сделать все это все.

К счастью, это не так большая проблема, как вы думаете.

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

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

const myTeachers = [  ['first', 'Cooper'],  ['second', 'Simes'],  ['third', 'Butler'],]const teachers = new Map(myTeachers);

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

Объекты становится лучше. С Object.entries () Вы можете создать массив пар из объекта.

const teachers = {  first: "Cooper",  second: "Simes",  third: "Butler",};
const myTeachers = Object.entries(teachers);
myTeachers[0]// ['first', 'Cooper']

Это означает, что когда у вас есть объект, у вас есть доступ к методам массива с простым преобразованием. Возвращаясь, хотя, немного сложнее. В настоящее время есть Предложение для Объект.Fromentries () Это займет массив пар и создает объект. Но это все еще немного уезжает.

Однако, как только это здесь, вы не будете заблокированы в какой-либо конкретный тип коллекции. И это лучшие новости всех. Как только вы сможете легко и быстро перемещаться между коллекциями, вы можете начать использовать лучшие функции каждого. Разрушительные значения, когда это удобно, итерация, когда вам нужно.

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

Оригинал: “https://www.freecodecamp.org/news/dont-settle-how-you-can-match-your-javascript-collection-to-your-goals-c94cb994be4e/”