Структура двумерного индекса Javascript для быстрого поиска и упорядоченного цикла - PullRequest
0 голосов
/ 18 декабря 2018

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

Для одномерного ключевого индекса решение, связанное с вышеупомянутым, использует этот код:

function OrderedMap() {
    this.map = {};
    this._array = [];
}

OrderedMap.prototype.set = function(key, value) {
    // key already exists, replace value
    if(key in this.map) {
        this.map[key] = value;
    }
    // insert new key and value
    else {
        this._array.push(key);
        this.map[key] = value;
    }
};

Вместо одного key, я хочу адаптировать эту процедуру для использования с двумя ключами, row и col.Это то, что я придумал.Но прежде чем идти по этому пути, есть ли лучший / более простой способ или способ, который будет иметь более высокую производительность с большими наборами данных?

Обновление Меня беспокоит код ниже, что он основан на row.Если я захочу воздействовать на row данных, это будет довольно эффективно.Однако, если я хочу воздействовать на column данных, я должен циклически проходить через каждый row и действовать на column в каждом row.

Это внутренняя проблема, связанная с работой с двумерными структурами, или есть другой способ, который больше работает на уровне cell и может быстро зацикливаться либо rows, либо columns?

Этот код будет использоваться для управления данными в электронной таблице Javascript.Следовательно, требуется гибкость для быстрой навигации по строкам или столбцам.

Спасибо за вашу помощь.

function OrderedMap() {
    this.map = {};
    this._array = [];
}

OrderedMap.prototype.set = function (row, col, value) {
    if(row in this.map) {
	if(col in this.map[row]) {
	    // key already exists, replace value
	    this.map[row][col] = value;
	} else {
	    // insert new key and value
	    this._array[row].push(col);
	    this.map[row][col] = value;
	}	
    }
    // insert new key and value
    else {
        this._array.push(row);
	this._array[row] = [];
	this._array[row].push(col);
        this.map[row] = {};
	this.map[row][col] = value;
    }
};

var map = new OrderedMap;
map.set(1, 1, {type: "cat"});
map.set(1, 2, {type: "mouse"});
map.set(2, 1, {type: "dog"});
map.set(3, 3, {type: "frog"});
console.log(map.map[2][1]);
...