← Назад к вопросам
Какие структуры данных можно создать поверх объекта?
2.0 Middle🔥 111 комментариев
#JavaScript Core
Комментарии (1)
🐱
deepseek-v3.2PrepBro AI4 апр. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Структуры данных на основе JavaScript-объектов
В JavaScript объект является фундаментальной структурой, поверх которой можно построить множество специализированных структур данных. Вот ключевые примеры:
1. Хеш-таблица / Ассоциативный массив
Сам объект уже является реализацией хеш-таблицы, но его можно расширить:
class HashTable {
constructor(size = 53) {
this.keyMap = new Array(size);
}
_hash(key) {
let total = 0;
for (let char of key) {
total = (total * 31 + char.charCodeAt(0)) % this.keyMap.length;
}
return total;
}
set(key, value) {
const index = this._hash(key);
if (!this.keyMap[index]) this.keyMap[index] = [];
this.keyMap[index].push([key, value]);
}
}
2. Стек на основе объекта
class ObjectStack {
constructor() {
this.storage = {};
this.count = 0;
}
push(element) {
this.storage[this.count] = element;
this.count++;
}
pop() {
if (this.count === 0) return undefined;
this.count--;
const result = this.storage[this.count];
delete this.storage[this.count];
return result;
}
}
3. Очередь
class ObjectQueue {
constructor() {
this.items = {};
this.front = 0;
this.rear = 0;
}
enqueue(element) {
this.items[this.rear] = element;
this.rear++;
}
dequeue() {
if (this.front === this.rear) return null;
const item = this.items[this.front];
delete this.items[this.front];
this.front++;
return item;
}
}
4. Связный список
class ListNode {
constructor(value) {
this.value = value;
this.next = null;
}
}
class LinkedList {
constructor() {
this.head = null;
this.tail = null;
this.length = 0;
}
addToTail(value) {
const newNode = { value, next: null };
if (!this.head) {
this.head = newNode;
} else {
this.tail.next = newNode;
}
this.tail = newNode;
this.length++;
}
}
5. Деревья и графы
class TreeNode {
constructor(value) {
this.value = value;
this.children = [];
}
addChild(node) {
this.children.push(node);
}
}
// Пример графа на основе adjacency list
class Graph {
constructor() {
this.adjacencyList = {};
}
addVertex(vertex) {
if (!this.adjacencyList[vertex]) {
this.adjacencyList[vertex] = [];
}
}
addEdge(vertex1, vertex2) {
this.adjacencyList[vertex1].push(vertex2);
this.adjacencyList[vertex2].push(vertex1);
}
}
6. Множество (Set)
class ObjectSet {
constructor() {
this.items = {};
}
add(value) {
if (!this.has(value)) {
this.items[value] = value;
return true;
}
return false;
}
has(value) {
return this.items.hasOwnProperty(value);
}
delete(value) {
if (this.has(value)) {
delete this.items[value];
return true;
}
return false;
}
}
7. Приоритетная очередь
class PriorityQueue {
constructor() {
this.values = [];
}
enqueue(val, priority) {
this.values.push({val, priority});
this.sort();
}
dequeue() {
return this.values.shift();
}
sort() {
this.values.sort((a, b) => a.priority - b.priority);
}
}
8. Trie (Префиксное дерево)
class TrieNode {
constructor() {
this.children = {};
this.isEndOfWord = false;
}
}
class Trie {
constructor() {
this.root = new TrieNode();
}
insert(word) {
let node = this.root;
for (let char of word) {
if (!node.children[char]) {
node.children[char] = new TrieNode();
}
node = node.children[char];
}
node.isEndOfWord = true;
}
search(word) {
let node = this.root;
for (let char of word) {
if (!node.children[char]) return false;
node = node.children[char];
}
return node.isEndOfWord;
}
}
Ключевые преимущества использования объектов:
- Быстрый доступ по ключу (в среднем O(1))
- Гибкость — ключами могут быть строки или символы
- Динамическое расширение без предварительного определения размера
- Интуитивная работа с JSON-данными
Ограничения и особенности:
- Ключи автоматически приводятся к строкам (кроме Symbol)
- Нет гарантированного порядка (кроме ES6+ где порядок строковых ключей сохраняется)
- Прототипное наследование может создавать неожиданные свойства
- Менее эффективны для числовых индексов чем массивы
На практике, современный JavaScript предлагает Map и Set для многих сценариев, где раньше использовались объекты, но понимание построения структур данных на основе объектов остается важным для глубокого понимания языка и решения специфических задач оптимизации.