JavaScriptで連想配列/ハッシングを行う方法


Answers

var associativeArray = {};
associativeArray["one"] = "First";
associativeArray["two"] = "Second";
associativeArray["three"] = "Third";

あなたがオブジェクト指向言語から来ているなら、 この記事をチェックしてください

Question

私はJavaScriptを使用していくつかの統計情報を計算/保存したいのですが、C#の同等のコードは以下の通りです(キーと値のペア、文字列/ intキーの値のペア、キーによる値の操作など) JavaScriptで同じ機能を実装するには? 組み込みのDictionaryやHashtableがないようですか?

Dictionary<string, int> statistics;

statistics["Foo"] = 10;
statistics["Goo"] = statistics["Goo"] + 1;
statistics.Add("Zoo", 1);



現代のブラウザはすべてjavascript Mapオブジェクトをサポートしています。 ObjectよりMapを使いやすくする理由はいくつかあります。

  • オブジェクトにはプロトタイプがあるため、マップにはデフォルトのキーがあります。
  • オブジェクトのキーは文字列で、マップの任意の値にできます。
  • オブジェクトのサイズを追跡する必要がある間に、マップのサイズを簡単に取得できます。

例:

var myMap = new Map();

var keyObj = {},
    keyFunc = function () {},
    keyString = "a string";

myMap.set(keyString, "value associated with 'a string'");
myMap.set(keyObj, "value associated with keyObj");
myMap.set(keyFunc, "value associated with keyFunc");

myMap.size; // 3

myMap.get(keyString);    // "value associated with 'a string'"
myMap.get(keyObj);       // "value associated with keyObj"
myMap.get(keyFunc);      // "value associated with keyFunc"

他のオブジェクトから参照されていないキーをガベージコレクトする場合は、マップの代わりにWeakMapを使用することを検討してください




オブジェクトキーマッピング、列挙能力( forEach()メソッド)、クリアなどの問題を解決するためにこれを作成しました。

function Hashtable() {
    this._map = new Map();
    this._indexes = new Map();
    this._keys = [];
    this._values = [];
    this.put = function(key, value) {
        var newKey = !this.containsKey(key);
        this._map.set(key, value);
        if (newKey) {
            this._indexes.set(key, this.length);
            this._keys.push(key);
            this._values.push(value);
        }
    };
    this.remove = function(key) {
        if (!this.containsKey(key))
            return;
        this._map.delete(key);
        var index = this._indexes.get(key);
        this._indexes.delete(key);
        this._keys.splice(index, 1);
        this._values.splice(index, 1);
    };
    this.indexOfKey = function(key) {
        return this._indexes.get(key);
    };
    this.indexOfValue = function(value) {
        return this._values.indexOf(value) != -1;
    };
    this.get = function(key) {
        return this._map.get(key);
    };
    this.entryAt = function(index) {
        var item = {};
        Object.defineProperty(item, "key", {
            value: this.keys[index],
            writable: false
        });
        Object.defineProperty(item, "value", {
            value: this.values[index],
            writable: false
        });
        return item;
    };
    this.clear = function() {
        var length = this.length;
        for (var i = 0; i < length; i++) {
            var key = this.keys[i];
            this._map.delete(key);
            this._indexes.delete(key);
        }
        this._keys.splice(0, length);
    };
    this.containsKey = function(key) {
        return this._map.has(key);
    };
    this.containsValue = function(value) {
        return this._values.indexOf(value) != -1;
    };
    this.forEach = function(iterator) {
        for (var i = 0; i < this.length; i++)
            iterator(this.keys[i], this.values[i], i);
    };
    Object.defineProperty(this, "length", {
        get: function() {
            return this._keys.length;
        }
    });
    Object.defineProperty(this, "keys", {
        get: function() {
            return this._keys;
        }
    });
    Object.defineProperty(this, "values", {
        get: function() {
            return this._values;
        }
    });
    Object.defineProperty(this, "entries", {
        get: function() {
            var entries = new Array(this.length);
            for (var i = 0; i < entries.length; i++)
                entries[i] = this.entryAt(i);
            return entries;
        }
    });
}


Hashtableクラスのドキュメント

メソッド:

  • get(key)
    指定されたキーに関連付けられた値を返します。
    パラメーター:
    key :値を取得するキー。

  • put(key, value)
    指定された値を指定されたキーに関連付けます。
    パラメーター:
    key :値を関連付けるキー。
    value :キーに関連付ける値。

  • remove(key)
    指定されたキーをその値で削除します。
    パラメーター:
    key :削除するキー。

  • clear()
    すべてのハッシュテーブルをクリアし、キーと値の両方を削除します。

  • indexOfKey(key)
    追加する順序に基づいて、指定されたキーのインデックスを返します。
    パラメーター:
    key :キーのインデックスを取得します。

  • indexOfValue(value)
    追加する順序に基づいて、指定された値のインデックスを返します。
    パラメーター:
    value :値がインデックスを取得します。
    ノート:
    この情報は、配列のindexOf()メソッドによって取得されるため、オブジェクトをtoString()メソッドと単に比較します。

  • entryAt(index)
    keyとvalueの2つのプロパティを持つオブジェクトを返します。指定されたインデックスのエントリを表します。
    パラメーター:
    index :取得するエントリのインデックス。

  • containsKey(key)
    ハッシュテーブルに指定されたキーが含まれているかどうかを返します。
    パラメーター:
    key :チェックするキー。

  • containsValue(value)
    ハッシュテーブルに指定された値が含まれるかどうかを返します。
    パラメーター:
    value :チェックする値。

  • forEach(iterator)
    指定されたiteratorすべてのエントリを反復処理します。
    パラメーター:
    valuekeyvalue 、およびindex 3つのパラメータを持つメソッド。indexはエントリのインデックスを表します。

    プロパティ:

  • length読み取り専用
    ハッシュテーブル内のエントリの数を取得します。

  • keys読み取り専用
    ハッシュテーブル内のすべてのキーの配列を取得します。

  • values読み取り専用
    ハッシュテーブル内のすべての値の配列を取得します。

  • entries読み取り専用
    ハッシュテーブル内のすべてのエントリの配列を取得します。 それらは、 entryAt()メソッドと同じ形式で表されます。




あなたのキーが文字列ではなくオブジェクトであれば、私のjshashtableを使うことができます。




function HashTable() {
    this.length = 0;
    this.items = new Array();
    for (var i = 0; i < arguments.length; i += 2) {
        if (typeof (arguments[i + 1]) != 'undefined') {
            this.items[arguments[i]] = arguments[i + 1];
            this.length++;
        }
    }

    this.removeItem = function (in_key) {
        var tmp_previous;
        if (typeof (this.items[in_key]) != 'undefined') {
            this.length--;
            var tmp_previous = this.items[in_key];
            delete this.items[in_key];
        }

        return tmp_previous;
    }

    this.getItem = function (in_key) {
        return this.items[in_key];
    }

    this.setItem = function (in_key, in_value) {
        var tmp_previous;
        if (typeof (in_value) != 'undefined') {
            if (typeof (this.items[in_key]) == 'undefined') {
                this.length++;
            } else {
                tmp_previous = this.items[in_key];
            }

            this.items[in_key] = in_value;
        }

        return tmp_previous;
    }

    this.hasItem = function (in_key) {
        return typeof (this.items[in_key]) != 'undefined';
    }

    this.clear = function () {
        for (var i in this.items) {
            delete this.items[i];
        }

        this.length = 0;
    }
}



Related