JavaScript имеет гораздо менее известные, но полезные функции. Одной из таких функций является объект Map. Представленный как часть спецификации ECMAScript 2015 (ES6) (и не путать с методом Array.protoype.map()), объект Map хранит упорядоченный список пар ключ-значение. Карты могут быть особенно полезны для хранения простых пар ключ-значение, таких как идентификаторы и имена пользователей:

const users = new Map();
users.set("1", "user1");
users.set("2", "user2");

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

const user1 = {
  username: "user1",
  favoriteColor: "blue",
};
const user2 = {
  username: "user2",
  favoriteColor: "green",
};
const users = new Map();
users.set("1", user1);
users.set("2", user2);

Теперь, когда у нас есть карта и общее понимание ее назначения, как нам на самом деле получить значения карты? В частности, как преобразовать значения Map в массив?

Решение

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

const result = [];
users.forEach((user) => result.push(user));

В этом решении мы создаем массив result для хранения значений и перебираем карту, добавляя каждое значение в массив. При повторении карты JavaScript каждая запись представляет значение этой пары ключ-значение. Это простое решение, и на самом деле в этом нет ничего плохого. Но можно ли его улучшить?

const result = Array.from(users.values());

Здесь мы используем полезный метод карты: Map.protoype.values(). Этот метод возвращает объект итератора для значений, содержащихся в Map. Поскольку это всего лишь итератор для значений, вам все равно нужно будет повторить эти значения, прежде чем вы получите результат. К счастью, метод Array.from() принимает такой объект итератора и создает новый массив. Это массив с неглубоким копированием, поэтому имейте это в виду, если вы используете его с любыми объектами с глубоко вложенными свойствами.

Окончательное решение кажется самым современным, поскольку оно использует синтаксис распространения ES6:

const result = [...users.values()];

Это решение похоже на предыдущее, но просто распространяет значения в массив, а не использует метод Array.from().

Заключение

Теперь у вас есть несколько различных способов преобразования значений карты в массив в JavaScript. Хотя объект Map не является самым популярным, он определенно найдет место в вашем наборе инструментов, когда дело доходит до создания списка данных, особенно если порядок имеет значение, и вы хотите иметь быстрый и легкий доступ к каждому элементу данных. Могут возникнуть некоторые споры о том, какой метод является наиболее эффективным, но, в конце концов, все зависит от вашего варианта использования и от того, что вам кажется наиболее кратким и удобочитаемым. Если у вас есть какие-либо другие творческие методы или мысли по поводу использованных здесь, пожалуйста, оставьте нам отзыв.

Вот полное решение:

function getValuesFirstApproach(map) {
  const result = [];
  map.forEach((value) => result.push(value));
  return result;
}
function getValuesSecondApproach(map) {
  return Array.from(map.values());
}
function getValuesThirdApproach(map) {
  return [...map.values()];
}
const users = new Map();
users.set("1", "user1");
users.set("2", "user2");
console.log(getValuesFirstApproach(users));
console.log(getValuesSecondApproach(users));
console.log(getValuesThirdApproach(users));