Если у карты есть только один элемент, как получить ее без циклов, если вы не знаете ключ? - PullRequest
0 голосов
/ 30 июня 2018

Правда ли, что единственный способ получить значение карты, когда в ней только один элемент, и вы не знаете, что ключ - это циклическая конструкция, которая повторяет карту?

или есть что-то вроде сокращения myMap.item (0)?

Ответы [ 4 ]

0 голосов
/ 30 июня 2018

Карта является итеративной. Согласно ссылка ,

Объект Map выполняет итерацию своих элементов в порядке вставки

Предполагается, что он будет повторяться для достижения определенного элемента. Так что [...myMap][0][1] фактически делает это, он выполняет итерацию всей карты и преобразует ее в массив, что не очень эффективно.

Несколько более эффективным способом может быть перебор ключей карты вместо:

myMap.get([...myMap.keys()][0])

И более эффективный способ состоит в том, чтобы не выполнять итерацию карты целиком и остановить итерацию при достижении элемента, например, с for..of:

let item;
let i = 0;
for (const key of myMap.keys()) {
  if (i === 0) {
    item = myMap.get(key);
    break;
  }
  i++;
}

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

0 голосов
/ 30 июня 2018

Карта - это словарь пар ключ-значение. Таким образом, чтобы получить значение, вам нужно использовать get , чтобы получить значение по ключу.

var map1 = new Map();
map1.set('bar', 'foo');
map1.set('cat', 'dog');

console.log(map1.get('bar'))
console.log(map1.get('cat'))

Если вам нужно получить значение по id, то карта, вероятно, не является правильным решением для ваших данных, и в этом случае массив объектов может быть лучше.

0 голосов
/ 30 июня 2018

Записи в карте сортируются по времени вставки и также могут повторяться как таковые с keys(), values() и entries(), как и любая итерация.

или есть что-то вроде myMap.item (0)?

Это может быть легко заполнено:

Map.prototype.item = function(index) {
  let done, value;
  const iterator = this.values();
  do {
    ({done, value} = iterator.next());
  } while(!done && index-- > 0)
  return value;
};

Или немного проще:

Map.prototype.item = function(index) {
  return [...this][index];
};
0 голосов
/ 30 июня 2018

Для достижения ожидаемого результата используйте опцию оператора расширения ES6 ниже и индекс [0] [1] без использования клавиши

var map = new Map()
map.set('contra', 'Asynchronous flow control')

console.log([...map][0][1])

пример кода - https://codepen.io/nagasai/pen/zaerbX

Объяснение:

[... map] предоставит массив массива с ключом, значение, т.е. [['contra', 'Asynchronous flow control']]
[... map] [0] предоставит массив значений ключа - ['contra', 'Asynchronous flow control']
[... map] [0] [0] получает ключ, т.е. 'contra' и
[... map] [0] [1] получает значение без использования ключа, т.е. 'Асинхронное управление потоком'

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...