Bagaimana cara melakukan asosiatif array / hashing dalam JavaScript

574

Saya perlu menyimpan beberapa statistik menggunakan JavaScript dengan cara seperti saya akan melakukannya di C #:

Dictionary<string, int> statistics;

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

Apakah ada Hashtablesesuatu seperti Dictionary<TKey, TValue>dalam JavaScript?
Bagaimana saya bisa menyimpan nilai sedemikian rupa?

George2
sumber
1
js diketik secara longgar, jadi tidak ada cara untuk mendeklarasikan string atau int, Anda bisa mendeklarasikan var dan menetapkannya string atau int. : D
Gordon Gustafson
Anda mungkin ingin memeriksa xDict. jsfiddle.net/very/MuVwd Ini adalah kamus String => apa pun yang ditulis dalam Javascript.
Robert
Artikel ini memiliki penjelasan yang sangat baik tentang bagaimana array asosiatif diimplementasikan di bawah tenda di Javascript jayconrod.com/posts/52/a-tour-of-v8-object-representation
Shuklaswag
Jawaban yang diterima ditulis pada tahun 2009 - hanya mendukung kunci string . Untuk kunci non-string, gunakan Map atau WeakMap, seperti dalam jawaban Vitalii .
ToolmakerSteve

Jawaban:

565

Gunakan objek JavaScript sebagai array asosiatif .

Array asosiatif: Dengan kata sederhana array asosiatif menggunakan Strings alih-alih angka Integer sebagai indeks.

Buat objek dengan

var dictionary = {};

Javascript memungkinkan Anda untuk menambahkan properti ke objek dengan menggunakan sintaks berikut:

Object.yourProperty = value;

Sintaks alternatif untuk hal yang sama adalah:

Object["yourProperty"] = value;

Jika Anda juga dapat membuat kunci untuk menilai peta objek dengan sintaks berikut

var point = { x:3, y:2 };

point["x"] // returns 3
point.y // returns 2

Anda dapat beralih melalui array asosiatif menggunakan for..in loop construct sebagai berikut

for(var key in Object.keys(dict)){
  var value = dict[key];
  /* use key/value for intended purpose */
}
Alek Davis
sumber
36
Perhatikan bahwa pendekatan penulis dalam menginisialisasi "array asosiatif" dengan new Array()tidak disukai. Artikel itu akhirnya menyebutkan kelemahannya dan menyarankan new Object()atau {}sebagai alternatif yang disukai, tapi itu sudah mendekati akhir dan saya khawatir sebagian besar pembaca tidak akan sejauh itu.
Daniel Lubarov
24
Gagal. JavaScript tidak mendukung referensi objek sebagai kunci, sedangkan Kamus Flash / AS3 mendukung. Dalam JavaScript,, var obj1 = {}; var obj2 = {}; var table= {}; table[obj1] = "A"; table[obj2] = "B"; alert(table[obj1]); //displays Bkarena tidak dapat membedakan antara kunci obj1 dan obj2; keduanya dikonversi menjadi string dan menjadi "Object". Gagal total, dan membuat serialisasi tipe-aman dengan referensi dan referensi siklik menjadi sulit atau tidak berfungsi dalam JavaScript. Mudah dalam Flash / AS3.
Triynko
Nah, satu-satunya cara di JS kita dapat memvalidasi dengan memeriksa kesetaraan atau mendefinisikan metode yang sama dengan sesuatu seperti ini: Point.prototype.equals = function(obj) { return (obj instanceof Point) && (obj.x === this.x) && (obj.y === this.y); };
Nadeem
1
@Leo console.log ({A: 'B', C: 'D'} [foo]) harus memberi Anda A B.
ychaouche
2
@ Leo Contohnya salah. for... inkarena kamus akan mengulangi kunci-kuncinya, jadi Object.keyssepertinya ada penempatan di sana. Object.keysmengembalikan array kunci dari kamus, dan for... inuntuk loop array yang lebih nya "kunci", yang untuk array yang indeksnya, bukan nilai-nilainya.
JHH
434
var associativeArray = {};
associativeArray["one"] = "First";
associativeArray["two"] = "Second";
associativeArray["three"] = "Third";

Jika Anda berasal dari bahasa berorientasi objek, Anda harus memeriksa artikel ini .

Dani Cricco
sumber
38
Anda juga bisa melakukan ini dalam baris yang lebih sedikit: var associativeArray = {"one": "First", "two": "second", "three": "Third"}; Kemudian associativeArray ["one"] mengembalikan "First" dan assocativeArray ["four"] mengembalikan null.
Tony Wickham
2
Maaf @JuusoOhtonen, saya menulis posting 6 tahun yang lalu (luar biasa betapa cepatnya waktu berlalu). Saya telah memperbarui tautannya. Silakan periksa dan jangan ragu untuk bertanya apakah Anda memiliki keraguan
Dani Cricco
145

Semua browser modern mendukung objek Peta javascript . Ada beberapa alasan yang menjadikan penggunaan Peta lebih baik daripada Objek:

  • Objek memiliki prototipe, jadi ada kunci default di peta.
  • Kunci dari suatu Objek adalah String, di mana mereka dapat menjadi nilai apa pun untuk Peta.
  • Anda bisa mendapatkan ukuran Peta dengan mudah sementara Anda harus melacak ukuran untuk Obyek.

Contoh:

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"

Jika Anda ingin kunci yang tidak dirujuk dari objek lain menjadi sampah yang dikumpulkan, pertimbangkan untuk menggunakan WeakMap alih-alih Peta.

Vitalii Fedorenko
sumber
5
Semoga dalam beberapa tahun ini akan menjadi jawaban yang paling banyak dipilih.
Cameron Lee
1
@CameronLee pasti akan
Loïc Faure-Lacroix
1
Ini Maphampir tidak berguna ketika kunci Anda adalah objek tetapi harus dibandingkan dengan nilai, bukan referensi.
Siyuan Ren
7
Lebih dari setahun setelah jawaban ini ditulis, masih TIDAK benar bahwa "semua browser modern mendukung Peta." Hanya di desktop Anda dapat mengandalkan setidaknya dukungan Peta dasar. Tidak di perangkat seluler. Misalnya, browser Android tidak memiliki dukungan Peta sama sekali. Bahkan di Desktop, beberapa implementasi tidak lengkap. Misalnya, IE11 masih tidak mendukung penghitungan melalui "untuk ... dari ...", jadi jika Anda ingin kompatibilitas IE, Anda harus menggunakan .forEach kludge yang menjijikkan. Juga, JSON.stringify () tidak berfungsi untuk Peta di browser apa pun yang saya coba. Inisialisasi juga tidak berfungsi di IE atau Safari.
Dave Burton
3
Ada dukungan browser yang sangat baik. Periksa lagi. Bagaimanapun, ini cukup mudah untuk di-polyfill, jadi dukungan browser asli bukan masalah.
Brad
132

Kecuali Anda memiliki alasan khusus untuk tidak melakukannya, cukup gunakan objek normal. Properti objek di Javascript dapat dirujuk menggunakan sintaksis gaya hashtable:

var hashtable = {};
hashtable.foo = "bar";
hashtable['bar'] = "foo";

Keduanya foodan barelemen sekarang dapat dirujuk sebagai:

hashtable['foo'];
hashtable['bar'];
// or
hashtable.foo;
hashtable.bar;

Tentu saja ini berarti kunci Anda harus berupa string. Jika bukan string, mereka dikonversi secara internal ke string, jadi mungkin masih berfungsi, YMMV.

roryf
sumber
1
Kunci sebagai bilangan bulat membuat saya tidak masalah. stackoverflow.com/questions/2380019/…
Jonas Elfström
10
Jonas: ingatlah bahwa integer Anda dikonversi menjadi string ketika properti sedang diset: var hash = {}; hash[1] = "foo"; alert(hash["1"]);alert "foo".
Tim Down
17
Bagaimana jika salah satu kunci Anda adalah " proto " atau " induk "?
PleaseStand
5
Perhatikan bahwa Objek tidak dapat digunakan sebagai kunci dalam JavaScript. Yah, mereka bisa, tetapi mereka dikonversi ke representasi String mereka, sehingga Obyek apa pun akan berakhir sebagai kunci yang sama persis. Lihat saran jshashtable @ TimDown di bawah ini.
ericsoco
21
Contoh ini membingungkan karena Anda menggunakan foo dan bar sebagai kunci dan nilai dalam dua contoh. Jauh lebih jelas untuk menunjukkan bahwa var dict = {}; dict.key1 = "val1"; dict["key2"] = "val2";elemen key1 dict dapat dirujuk secara setara oleh keduanya dict["key1"]dan dict.key1.
Jim
49

Karena setiap objek di JS berperilaku seperti - dan umumnya diimplementasikan sebagai - hashtable, saya hanya pergi dengan itu ...

var hashSweetHashTable = {};
Shog9
sumber
26
Diturunkan karena tidak menunjukkan cara sebenarnya mengakses nilai dalam "hashtable".
IQAndreas
Saya terlambat 9 tahun (saya tidak tahu banyak tentang pemrograman, apalagi situs ini waktu itu), tapi ... Bagaimana jika Anda mencoba menyimpan poin di peta, dan perlu melihat apakah ada sesuatu yang sudah pada suatu titik di peta? Dalam hal ini, Anda sebaiknya menggunakan HashTable untuk ini, mencari berdasarkan koordinat ( objek , bukan string ).
Mike Warren
@MikeWarren if (hashSweetHashTable.foo)harus memasukkan blok if jika foodiset.
Koray Tugay
21

jadi di C # kodenya terlihat seperti:

Dictionary<string,int> dictionary = new Dictionary<string,int>();
dictionary.add("sample1", 1);
dictionary.add("sample2", 2);

atau

var dictionary = new Dictionary<string, int> {
    {"sample1", 1},
    {"sample2", 2}
};

dalam JavaScript

var dictionary = {
    "sample1": 1,
    "sample2": 2
}

Objek kamus C # berisi metode yang berguna seperti dictionary.ContainsKey() dalam JavaScript kita bisa menggunakan hasOwnPropertysejenisnya

if (dictionary.hasOwnProperty("sample1"))
    console.log("sample1 key found and its value is"+ dictionary["sample1"]);
Raj
sumber
1
hasOwnProperty
Suara positif
18

Jika Anda memerlukan kunci Anda untuk menjadi objek apa pun daripada hanya string maka Anda bisa menggunakan jshashtable saya .

Tim Down
sumber
3
Berapa jam yang saya habiskan untuk menemukan fakta bahwa Object tidak dapat benar-benar digunakan sebagai kunci untuk array gaya JS-Object-as-asosiatif sebelum saya menemukan ini? Terima kasih, Tim.
ericsoco
1
Kamus Flash / AS3, bersama dengan sebagian besar bahasa lain, mendukung referensi objek sebagai kunci. JavaScript masih belum mengimplementasikannya, tapi saya pikir ini dalam spesifikasi masa depan sebagai semacam kelas Peta. Sekali lagi dengan polyfill sementara itu; begitu banyak untuk standar. Oh, tunggu ... akhirnya pada tahun 2015, Peta tampaknya telah tiba: stackoverflow.com/a/30088129/88409 , dan didukung oleh peramban "modern", lol: kangax.github.io/compat-table/es6/# Peta (dan tidak didukung secara luas). Hanya satu dekade di belakang AS3.
Triynko
Tim, mungkin Anda harus memperbarui jshashtable untuk menggunakan Map () jika tersedia.
Dave Burton
1
@ DaveBurton: Rencana bagus. Saya akan melakukannya segera setelah saya punya waktu.
Tim Down
6
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;
    }
}
Birey
sumber
1
Untuk orang-orang yang sedang memilih ini, dapatkah Anda berkomentar mengapa? Jawaban ini diposting pada 2011 dan bukan pada tanggal saat ini.
Birey
2
Saya tidak memilih, tapi ... Anda tidak boleh menggunakan array sebagai objek. Tidak 100% yakin apakah ini niat Anda. Gunakan irisan pada array yang tidak dihapus untuk mengindeks ulang; hapus tidak apa-apa tetapi akan ditetapkan ke tidak terdefinisi - lebih baik untuk menjadi eksplisit; gunakan = tidak terdefinisi pada objek juga b / c lebih cepat (tetapi lebih banyak memori). Singkatnya: selalu gunakan objek: {}bukan array: []atau new Array()jika Anda berniat untuk memiliki kunci string, jika tidak mesin js memiliki masalah - ia akan melihat 2 jenis untuk 1 variabel yang berarti tidak ada optimasi atau akan berjalan dengan array dan menyadari itu harus berubah menjadi objek (kemungkinan alokasi ulang).
Graeme Wicksted
2
Sama seperti jawaban Alex Hawkins, berikan penjelasan mengapa kode yang terlihat rumit ini sebenarnya bermanfaat dan lebih baik daripada jawaban pendek lainnya yang diberikan di sini.
Thomas Tempelmann
6

Saya membuat ini untuk mencapai beberapa masalah, seperti pemetaan kunci objek, kemampuan enumerasi (dengan forEach()metode) dan kliring.

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;
        }
    });
}


Dokumentasi kelas Hashtable

Metode:

  • get(key)
    Mengembalikan nilai yang terkait dengan kunci yang ditentukan.
    Parameter::
    key Kunci dari mana mengambil nilai.

  • put(key, value)
    Mengaitkan nilai yang ditentukan ke kunci yang ditentukan.
    Parameter::
    key Kunci yang mengaitkan nilai.
    value: Nilai untuk dikaitkan dengan kunci.

  • remove(key)
    Menghapus kunci yang ditentukan dengan nilainya.
    Parameter::
    key Kunci untuk menghapus.

  • clear()
    Menghapus semua hashtable, menghapus kunci dan nilai.

  • indexOfKey(key)
    Mengembalikan indeks kunci yang ditentukan, berdasarkan pada urutan penambahan.
    Parameter::
    key Kunci yang mendapatkan indeks.

  • indexOfValue(value)
    Mengembalikan indeks dari nilai yang ditentukan, berdasarkan pada urutan penambahan.
    Parameter::
    value Nilai yang mendapatkan indeks.
    Catatan:
    Informasi ini diambil dengan indexOf()metode array, sehingga membandingkan objek hanya dengan toString()metode.

  • entryAt(index)
    Mengembalikan objek dengan dua properti: kunci dan nilai, mewakili entri pada indeks yang ditentukan.
    Parameter::
    index Indeks entri untuk mendapatkan.

  • containsKey(key)
    Mengembalikan apakah hashtable berisi kunci yang ditentukan.
    Parameter::
    key Kunci untuk memeriksa.

  • containsValue(value)
    Mengembalikan apakah hashtable berisi nilai yang ditentukan.
    Parameter::
    value Nilai yang akan diperiksa.

  • forEach(iterator)
    Iterasi semua entri dalam yang ditentukan iterator.
    Parameter:
    value : Sebuah metode dengan 3 parameter: key, valuedan index, di mana indexmerupakan indeks entri.

    Properti:

  • length (Hanya Baca )
    Mendapat hitungan entri dalam hashtable.

  • keys (Hanya Baca )
    Mendapat array dari semua kunci di hashtable.

  • values (Hanya baca )
    Mendapat array dari semua nilai dalam hashtable.

  • entries (Hanya baca )
    Mendapat array dari semua entri di hashtable. Mereka direpresentasikan dalam bentuk metode yang sama entryAt().

Davide Cannizzo
sumber
2

https://gist.github.com/alexhawkins/f6329420f40e5cafa0a4

var HashTable = function() {
  this._storage = [];
  this._count = 0;
  this._limit = 8;
}


HashTable.prototype.insert = function(key, value) {
  //create an index for our storage location by passing it through our hashing function
  var index = this.hashFunc(key, this._limit);
  //retrieve the bucket at this particular index in our storage, if one exists
  //[[ [k,v], [k,v], [k,v] ] , [ [k,v], [k,v] ]  [ [k,v] ] ]
  var bucket = this._storage[index]
    //does a bucket exist or do we get undefined when trying to retrieve said index?
  if (!bucket) {
    //create the bucket
    var bucket = [];
    //insert the bucket into our hashTable
    this._storage[index] = bucket;
  }

  var override = false;
  //now iterate through our bucket to see if there are any conflicting
  //key value pairs within our bucket. If there are any, override them.
  for (var i = 0; i < bucket.length; i++) {
    var tuple = bucket[i];
    if (tuple[0] === key) {
      //overide value stored at this key
      tuple[1] = value;
      override = true;
    }
  }

  if (!override) {
    //create a new tuple in our bucket
    //note that this could either be the new empty bucket we created above
    //or a bucket with other tupules with keys that are different than 
    //the key of the tuple we are inserting. These tupules are in the same
    //bucket because their keys all equate to the same numeric index when
    //passing through our hash function.
    bucket.push([key, value]);
    this._count++
      //now that we've added our new key/val pair to our storage
      //let's check to see if we need to resize our storage
      if (this._count > this._limit * 0.75) {
        this.resize(this._limit * 2);
      }
  }
  return this;
};


HashTable.prototype.remove = function(key) {
  var index = this.hashFunc(key, this._limit);
  var bucket = this._storage[index];
  if (!bucket) {
    return null;
  }
  //iterate over the bucket
  for (var i = 0; i < bucket.length; i++) {
    var tuple = bucket[i];
    //check to see if key is inside bucket
    if (tuple[0] === key) {
      //if it is, get rid of this tuple
      bucket.splice(i, 1);
      this._count--;
      if (this._count < this._limit * 0.25) {
        this._resize(this._limit / 2);
      }
      return tuple[1];
    }
  }
};



HashTable.prototype.retrieve = function(key) {
  var index = this.hashFunc(key, this._limit);
  var bucket = this._storage[index];

  if (!bucket) {
    return null;
  }

  for (var i = 0; i < bucket.length; i++) {
    var tuple = bucket[i];
    if (tuple[0] === key) {
      return tuple[1];
    }
  }

  return null;
};


HashTable.prototype.hashFunc = function(str, max) {
  var hash = 0;
  for (var i = 0; i < str.length; i++) {
    var letter = str[i];
    hash = (hash << 5) + letter.charCodeAt(0);
    hash = (hash & hash) % max;
  }
  return hash;
};


HashTable.prototype.resize = function(newLimit) {
  var oldStorage = this._storage;

  this._limit = newLimit;
  this._count = 0;
  this._storage = [];

  oldStorage.forEach(function(bucket) {
    if (!bucket) {
      return;
    }
    for (var i = 0; i < bucket.length; i++) {
      var tuple = bucket[i];
      this.insert(tuple[0], tuple[1]);
    }
  }.bind(this));
};


HashTable.prototype.retrieveAll = function() {
  console.log(this._storage);
  //console.log(this._limit);
};

/******************************TESTS*******************************/

var hashT = new HashTable();

hashT.insert('Alex Hawkins', '510-599-1930');
//hashT.retrieve();
//[ , , , [ [ 'Alex Hawkins', '510-599-1930' ] ] ]
hashT.insert('Boo Radley', '520-589-1970');
//hashT.retrieve();
//[ , [ [ 'Boo Radley', '520-589-1970' ] ], , [ [ 'Alex Hawkins', '510-599-1930' ] ] ]
hashT.insert('Vance Carter', '120-589-1970').insert('Rick Mires', '520-589-1970').insert('Tom Bradey', '520-589-1970').insert('Biff Tanin', '520-589-1970');
//hashT.retrieveAll();
/* 
[ ,
  [ [ 'Boo Radley', '520-589-1970' ],
    [ 'Tom Bradey', '520-589-1970' ] ],
  ,
  [ [ 'Alex Hawkins', '510-599-1930' ],
    [ 'Rick Mires', '520-589-1970' ] ],
  ,
  ,
  [ [ 'Biff Tanin', '520-589-1970' ] ] ]
*/

//overide example (Phone Number Change)
//
hashT.insert('Rick Mires', '650-589-1970').insert('Tom Bradey', '818-589-1970').insert('Biff Tanin', '987-589-1970');
//hashT.retrieveAll();

/* 
[ ,
  [ [ 'Boo Radley', '520-589-1970' ],
    [ 'Tom Bradey', '818-589-1970' ] ],
  ,
  [ [ 'Alex Hawkins', '510-599-1930' ],
    [ 'Rick Mires', '650-589-1970' ] ],
  ,
  ,
  [ [ 'Biff Tanin', '987-589-1970' ] ] ]

*/

hashT.remove('Rick Mires');
hashT.remove('Tom Bradey');
//hashT.retrieveAll();

/* 
[ ,
  [ [ 'Boo Radley', '520-589-1970' ] ],
  ,
  [ [ 'Alex Hawkins', '510-599-1930' ] ],
  ,
  ,
  [ [ 'Biff Tanin', '987-589-1970' ] ] ]


*/

hashT.insert('Dick Mires', '650-589-1970').insert('Lam James', '818-589-1970').insert('Ricky Ticky Tavi', '987-589-1970');
hashT.retrieveAll();


/* NOTICE HOW HASH TABLE HAS NOW DOUBLED IN SIZE UPON REACHING 75% CAPACITY ie 6/8. It is now size 16.
 [,
  ,
  [ [ 'Vance Carter', '120-589-1970' ] ],
  [ [ 'Alex Hawkins', '510-599-1930' ],
    [ 'Dick Mires', '650-589-1970' ],
    [ 'Lam James', '818-589-1970' ] ],
  ,
  ,
  ,
  ,
  ,
  [ [ 'Boo Radley', '520-589-1970' ],
    [ 'Ricky Ticky Tavi', '987-589-1970' ] ],
  ,
  ,
  ,
  ,
  [ [ 'Biff Tanin', '987-589-1970' ] ] ]




*/
console.log(hashT.retrieve('Lam James'));  //818-589-1970
console.log(hashT.retrieve('Dick Mires')); //650-589-1970
console.log(hashT.retrieve('Ricky Ticky Tavi')); //987-589-1970
console.log(hashT.retrieve('Alex Hawkins')); //510-599-1930
console.log(hashT.retrieve('Lebron James')); //null
Alex Hawkins
sumber
3
Terlihat bagus. Sekarang, tolong jelaskan juga MENGAPA ini berguna dan mungkin lebih cocok daripada semua jawaban lain di sini.
Thomas Tempelmann
1

Anda dapat membuatnya menggunakan seperti berikut:

var dictionary = { Name:"Some Programmer", Age:24, Job:"Writing Programs"  };

//Iterate Over using keys
for (var key in dictionary) {
  console.log("Key: " + key + " , " + "Value: "+ dictionary[key]);
}

//access a key using object notation:
console.log("Her Name is: " + dictionary.Name)

Ali Ezzat Odeh
sumber