ES6 Hashmap с 2 ключами - PullRequest
       1

ES6 Hashmap с 2 ключами

0 голосов
/ 02 февраля 2019

Представлен JavaScript ES6 Map реализован с использованием хеш-таблицы.Поскольку время просмотра хеш-таблицы в среднем равно O (1), для данных со случайным доступом, Map представляется хорошим выбором для хранения данных.

Однако в JavaScript нет таких структур данных, как structв C ++ это можно использовать в качестве ключей на карте для включения «сопоставления нескольких ключей».Ближайшими объектами являются Объекты, но их экземпляры не равны друг другу, даже если «содержимое одинаковое».

Если я хочу сохранить карту игры на основе 2D или 3D плитки, используя Map type, есть ли способ легко получить доступ к блокам, заданным координатами? Конечно, строки вроде "1,2,3" (представляющие x, y, z) будут работать, но есть ли способ, которым мы можем использовать целые числа в качестве ключей?

И если мне придется вернуться к использованию собранных строковых координат, значительно ли снизится производительность?

РЕДАКТИРОВАТЬ: Я хочу использовать хеш-таблицу, потому что может быть«дыры» в картах и ​​тайлах могут быть созданы случайно в середине нигде.

Ответы [ 3 ]

0 голосов
/ 02 февраля 2019

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

const map = [];
for(let x=0; x<2; x++) {
  let xArr = [];
  map.push(xArr);
  for(let y=0; y<2; y++) {
    let yArr = [];
    xArr.push(yArr);
    for(let z=0; z<2; z++) {
      yArr.push(`${x},${y},${z}`);
    }
  }
}
console.log(map[1][1][0]);
console.log(map);
0 голосов
/ 02 февраля 2019

Я только что сделал тест производительности между хранением в массиве и вложенным объектом, а также объектом со строковыми ключами.Результат меня удивляет.Самый быстрый - это объект со строковыми ключами.

https://jsperf.com/multiple-dimension-sparse-matrix

Array           OPS 0.48    ±5.19%     77% slower    //a[z][y][x]
Nested Object   OPS 0.51    ±16.65%    77% slower    //a[z][y][x]
String Object   OPS 2.96    ±29.77%    fastest       //a["x,y,z"]
0 голосов
/ 02 февраля 2019

Кроме объединения ключей в строку, как вы упомянули (что очень хорошо для IMO), другой вариант - использовать несколько вложенных Map с.Например, для 3d-структуры доступ к 1,2,3 (скажем, к осям x, y и z) можно сделать с помощью

bigMap.get(1).get(2).get(3)

, где bigMap (содержащий 3d-структуру) содержит Map значений для каждого среза y и z, и каждое из этих имеет ключи Map, соответствующие каждому срезу z, а каждая карта z-slice имеет значения, содержащие информацию по каждой координате.

Но хотя это возможность , ваше представление об объекте или Map, проиндексированном координатами, разделенными запятыми, совершенно нормально и, вероятно, более понятно с первого взгляда. IMO.

Помните, что свойство объектапоиск - это O(1) точно так же, как Map поиск - нет снижения производительности, если вы используете один объект (или Map), индексированный по строкам.

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