Jak usprawnić przeładowanie tablicy do hasha?

0

Oto fragment programu. Tablica przechowuje tablice dwuelementowe. Program działa jak trzeba, ale napiszcie czy warto, a jak tak to jak to zrobić by zoptymalizować program aby za każdym razem nie przepisywał całej tablicy do hasha.

/* ... */
var fields = [];
var fieldsHash = {};

var loadFieldsIntoFieldsHash = function() {
  for(var i = 0 ; i < fields.length; i += 1) {
    fieldsHash[fields[i]] = i;
  }
}
var isFreeField = function(row, column) {
  loadFieldsIntoFieldsHash();
  var val = [row-1, column-1];
  if(fieldsHash.hasOwnProperty(val)) {
    return false;
  }
  return true;
}
/* ... */
0

@novpet to nie Java ;) W javascriptcie nie ma czegos takiego jak tablice asocjacyjne czy hashmapy.** Sa tablice i sa obiekty.**

Tutaj masz test key vs array search performance oraz object-index vs array search performance

3

Może maps ze specyfikacji ES6 przyda ci się ? Dane trzymasz w formie key:value, prosta iteracja.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map .

0

Jeśli chcesz pozostać przy swoim rozwiązaniu a zaoszczędzić tylko na każdorazowym przepisywaniu na obiekt, to pierwsze co mi do głowy przychodzi, to stworzyć obiekt. Na przykład (nie testowałem zbyt dokładnie, chciałem pokazać tylko koncepcję):

function Fields() {
  var fields = [];
  var fieldsHash = {};

  var loadFieldsIntoFieldsHash = function() {
  	fieldsHash = {};
    for(var i = 0 ; i < fields.length; i += 1) {
      fieldsHash[fields[i]] = i;
    }
  }

  this.isFreeField = function(row, column) {
    var val = [row-1, column-1];
    if(fieldsHash.hasOwnProperty(val)) {
      return false;
    }
    return true;
  }

  this.setFields = function(newArray) {
  	fields = newArray;
    loadFieldsIntoFieldsHash();
  }
}

var fields = new Fields();
fields.setFields([[1,2], [0,0]]);
console.log('wynik (oczekiwany false):', fields.isFreeField(2,3));
console.log('wynik (oczekiwany true):', fields.isFreeField(2,2));
fields.setFields([[5,8], [8,5]]);
console.log('wynik (oczekiwany true):', fields.isFreeField(2,3));
console.log('wynik (oczekiwany false):', fields.isFreeField(6,9));
console.log('wynik (oczekiwany true):', fields.isFreeField(10,10));

1 użytkowników online, w tym zalogowanych: 0, gości: 1