Как преобразовать ключи карты в массив?
Допустим, у меня есть следующая карта:
let myMap = new Map().set('a', 1).set('b', 2);
И я хочу получить ['a', 'b'] на основе вышеизложенного. Мое текущее решение кажется таким долгим и ужасным.
let myMap = new Map().set('a', 1).set('b', 2);
let keys = [];
for (let key of myMap)
keys.push(key);
console.log(keys);
Должен быть лучший способ, нет?
Ответы
Ответ 1
Map.keys()
возвращает объект MapIterator
, который можно преобразовать в Array
, используя Array.from
:
let keys = Array.from( myMap.keys() );
// ["a", "b"]
EDIT: вы также можете преобразовать итерируемый объект в массив, используя синтаксис распространения
let keys =[ ...myMap.keys() ];
// ["a", "b"]
Ответ 2
Вы можете использовать оператор распространения для преобразования итератора Map.keys() в массив.
let myMap = new Map().set('a', 1).set('b', 2).set(983, true)
let keys = [...myMap.keys()]
console.log(keys)
Ответ 3
Array.from(myMap.keys())
не работает в сценариях приложения Google.
Попытка его использования приводит к ошибке TypeError: Cannot find function from in object function Array() { [native code for Array.Array, arity=1] }
.
Чтобы получить список ключей в GAS, выполните следующие действия:
var keysList = Object.keys(myMap);
Ответ 4
Мне нужно что-то похожее на угловатую реактивную форму:
let myMap = new Map().set(0, {status: 'VALID'}).set(1, {status: 'INVALID'});
let mapToArray = Array.from(myMap.values());
let isValid = mapToArray.every(x => x.status === 'VALID');
Ответ 5
Не совсем лучший ответ на вопрос, но этот new Array(...someMap)
трюк new Array(...someMap)
спас меня пару раз, когда мне нужны и ключ, и значение для генерации необходимого массива. Например, когда необходимо создать реагирующие компоненты из объекта Map на основе значений ключа и значения.
let map = new Map();
map.set("1", 1);
map.set("2", 2);
console.log(new Array(...map).map(pairs => pairs[0])); -> ["1", "2"]
Ответ 6
Хорошо, давайте немного подробнее и начнем с того, что Map для тех, кто не знает эту функцию в JavaScript... MDN говорит:
Объект Map содержит пары ключ-значение и запоминает исходный порядок вставки ключей.
Любое значение (как объекты, так и примитивные значения) может использоваться в качестве ключа или значения.
Как вы упомянули, вы можете легко создать экземпляр Map, используя новое ключевое слово... В вашем случае:
let myMap = new Map().set('a', 1).set('b', 2);
Итак, давайте посмотрим...
То, как вы упомянули, является хорошим способом сделать это, но да, есть более краткие способы сделать это...
В Map есть много методов, которые вы можете использовать, например set()
который вы уже использовали для назначения значений ключей...
Одним из них является keys()
который возвращает все ключи...
В вашем случае он вернет:
MapIterator {"a", "b"}
и вы легко конвертируете их в массив, используя способы ES6, такие как оператор распространения...
const b = [...myMap.keys()];