Cách thực hiện kết hợp mảng / băm trong JavaScript


574

Tôi cần lưu trữ một số thống kê bằng JavaScript theo cách tôi muốn làm trong C #:

Dictionary<string, int> statistics;

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

Có một Hashtablecái gì đó giống như Dictionary<TKey, TValue>trong JavaScript không?
Làm thế nào tôi có thể lưu trữ các giá trị theo cách như vậy?


1
js được gõ lỏng lẻo, vì vậy không có cách nào để chỉ khai báo một chuỗi hoặc int, bạn chỉ có thể khai báo một var và gán cho nó một chuỗi hoặc int. : D
Gordon Gustafson

Bạn có thể muốn kiểm tra xDict. jsfiddle.net/very/MuVwd Đây là một chuỗi từ điển => bất cứ điều gì được viết bằng Javascript.
Robert

Bài viết này có một lời giải thích tuyệt vời về cách các mảng kết hợp được triển khai trong chương trình Javascript jayconrod.com/posts/52/a-tour-of-v8-object-interesentation
Shuklaswag

Câu trả lời được chấp nhận đã được viết vào năm 2009 - nó chỉ hỗ trợ các khóa chuỗi . Đối với các khóa không có chuỗi, sử dụng Map hoặc WeakMap, như trong câu trả lời của Vitalii .
ToolmakerSteve

Câu trả lời:


564

Sử dụng các đối tượng JavaScript như các mảng kết hợp .

Associative Array: Trong các từ đơn giản, mảng kết hợp sử dụng Chuỗi thay vì số nguyên làm chỉ mục.

Tạo một đối tượng với

var dictionary = {};

Javascript cho phép bạn thêm thuộc tính vào các đối tượng bằng cách sử dụng cú pháp sau:

Object.yourProperty = value;

Một cú pháp thay thế cho cùng là:

Object["yourProperty"] = value;

Nếu bạn cũng có thể tạo khóa để đánh giá bản đồ đối tượng theo cú pháp sau

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

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

Bạn có thể lặp qua một mảng kết hợp bằng cách sử dụng cấu trúc vòng lặp for..in như sau

for(var key in Object.keys(dict)){
  var value = dict[key];
  /* use key/value for intended purpose */
}

36
Lưu ý rằng cách tiếp cận của tác giả về việc khởi tạo một "mảng kết hợp" với new Array()sẽ không được chấp nhận. Bài báo cuối cùng đề cập đến những hạn chế của nó và gợi ý new Object()hoặc {}là những lựa chọn thay thế ưa thích, nhưng đó là gần cuối và tôi sợ hầu hết độc giả sẽ không đi xa đến thế.
Daniel Lubarov

24
Thất bại. JavaScript không hỗ trợ các tham chiếu đối tượng dưới dạng các khóa, trong khi một cái gì đó như Flash / AS3 Dictionary thì có. Trong JavaScript, var obj1 = {}; var obj2 = {}; var table= {}; table[obj1] = "A"; table[obj2] = "B"; alert(table[obj1]); //displays Bvì nó không thể phân biệt giữa các khóa obj1 và obj2; cả hai đều được chuyển đổi thành chuỗi và trở thành một cái gì đó như "Đối tượng". Hoàn toàn thất bại và làm cho việc xê-ri hóa an toàn kiểu với các tham chiếu và tham chiếu theo chu kỳ không còn khó hoặc không thực hiện trong JavaScript. Thật dễ dàng trong Flash / AS3.
Triynko

Chà, cách duy nhất trong JS chúng ta có thể xác nhận bằng cách kiểm tra đẳng thức hoặc xác định phương thức bằng bằng cách như sau: 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]) sẽ cung cấp cho bạn A B.
ychaouche

2
@Leo Ví dụ có vẻ sai. for... inđối với một từ điển sẽ lặp qua các khóa của nó, vì vậy Object.keysdường như không đúng chỗ. Object.keystrả về một mảng các khóa của từ điển và for... incho một vòng lặp trên các "khóa" của nó , mà đối với một mảng là các chỉ số của nó, không phải là các giá trị của nó.
JHH

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

Nếu bạn đang đến từ một ngôn ngữ hướng đối tượng, bạn nên kiểm tra bài viết này .


38
Bạn cũng có thể thực hiện việc này trong ít dòng hơn: var AssociativeArray = {"one": "First", "hai": "second", "ba": "third"}; Sau đó, AssociativeArray ["one"] trả về "Đầu tiên" và assocativeArray ["bốn"] trả về null.
Tony Wickham

2
Xin lỗi @JuusoOhtonen, tôi đã viết bài đăng 6 năm trước (thật không thể tin được thời gian trôi nhanh như thế nào). Tôi đã cập nhật các liên kết. Vui lòng kiểm tra và đừng ngần ngại hỏi bạn có nghi ngờ gì không
Dani Cricco

145

Tất cả các trình duyệt hiện đại đều hỗ trợ một đối tượng Bản đồ javascript . Có một số lý do khiến việc sử dụng Bản đồ tốt hơn Đối tượng:

  • Một đối tượng có một nguyên mẫu, vì vậy có các khóa mặc định trong bản đồ.
  • Các khóa của Đối tượng là Chuỗi, trong đó chúng có thể là bất kỳ giá trị nào cho Bản đồ.
  • Bạn có thể dễ dàng lấy kích thước của Bản đồ trong khi bạn phải theo dõi kích thước cho Đối tượng.

Thí dụ:

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"

Nếu bạn muốn các khóa không được tham chiếu từ các đối tượng khác là rác được thu thập, hãy xem xét sử dụng WeakMap thay vì Bản đồ.


5
Hy vọng trong một vài năm, đây sẽ là câu trả lời được bình chọn nhiều nhất.
Cameron Lee

1
@CameronLee chắc chắn nó sẽ
Loïc Faure-Lacroix

1
Điều này Maphầu như không hữu ích khi khóa của bạn là một đối tượng nhưng nên được so sánh theo giá trị, không phải tham chiếu.
Siyuan Ren

7
Hơn một năm sau khi câu trả lời này được viết, vẫn chưa đúng "tất cả các trình duyệt hiện đại đều hỗ trợ Bản đồ". Chỉ trên máy tính để bàn, bạn mới có thể tin tưởng vào ít nhất là hỗ trợ Bản đồ cơ bản. Không phải trên thiết bị di động. Ví dụ, trình duyệt Android không có hỗ trợ Bản đồ nào cả. Ngay cả trên Bàn làm việc, một số triển khai không đầy đủ. Chẳng hạn, IE11 vẫn không hỗ trợ liệt kê thông qua "cho ... của ...", vì vậy nếu bạn muốn tương thích với IE, bạn phải sử dụng loại bùn .forEach đáng ghét. Ngoài ra, JSON.opesify () không hoạt động cho Map trong bất kỳ trình duyệt nào tôi đã thử. Ngoài ra, trình khởi tạo không hoạt động trong IE hoặc Safari.
Dave Burton

3
Có hỗ trợ trình duyệt tuyệt vời. Kiểm tra lại. Trong mọi trường hợp, điều này khá dễ dàng để polyfill, vì vậy hỗ trợ trình duyệt riêng không phải là vấn đề.
Brad

132

Trừ khi bạn có một lý do cụ thể để không, chỉ cần sử dụng một đối tượng bình thường. Các thuộc tính đối tượng trong Javascript có thể được tham chiếu bằng cú pháp kiểu hashtable:

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

Cả hai foobarcác phần tử bây giờ có thể được tham chiếu là:

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

Tất nhiên điều này không có nghĩa là các khóa của bạn phải là chuỗi. Nếu chúng không phải là chuỗi, chúng được chuyển đổi bên trong thành chuỗi, vì vậy nó vẫn có thể hoạt động, YMMV.


1
Chìa khóa như số nguyên gây ra cho tôi không có vấn đề. stackoverflow.com/questions/2380019/ cường
Jonas Elfström

10
Jonas: lưu ý rằng số nguyên của bạn được chuyển đổi thành chuỗi khi thuộc tính đang được đặt: var hash = {}; hash[1] = "foo"; alert(hash["1"]);cảnh báo "foo".
Tim Down

17
Điều gì nếu một trong các khóa của bạn là " proto " hoặc " cha mẹ "?
Vui lòng khởi động

5
Lưu ý rằng Đối tượng không thể được sử dụng làm khóa trong JavaScript. Chà, họ có thể, nhưng họ đã được chuyển đổi thành các biểu diễn Chuỗi của họ, vì vậy bất kỳ Đối tượng nào cũng sẽ có cùng một khóa chính xác. Xem đề xuất jshashtable của @ TimDown bên dưới.
ericsoco

21
Ví dụ này gây nhầm lẫn vì bạn đang sử dụng foo và bar làm cả khóa và giá trị trong hai trường hợp. Rõ ràng hơn nhiều để chỉ ra rằng var dict = {}; dict.key1 = "val1"; dict["key2"] = "val2";phần tử key1 của dict có thể được tham chiếu tương đương bởi cả hai dict["key1"]dict.key1.
Jim

49

Vì mọi đối tượng trong JS hoạt động như - và thường được triển khai như - một hashtable, tôi chỉ đi với điều đó ...

var hashSweetHashTable = {};

26
Bị từ chối vì nó không hiển thị cách thực sự truy cập các giá trị trong "hashtable".
IQAndreas 14/03/2015

Tôi trễ 9 năm rồi (tôi không biết gì nhiều về lập trình, chứ đừng nói đến trang này), nhưng ... Nếu bạn đang cố lưu trữ điểm trên bản đồ, và cần xem có gì đó chưa tại một điểm trên bản đồ? Trong trường hợp đó, bạn sẽ sử dụng HashTable tốt nhất cho việc này, tìm kiếm theo tọa độ (một đối tượng , không phải chuỗi ).
Mike Warren

@MikeWarren if (hashSweetHashTable.foo)nên nhập khối if nếu foođược đặt.
Koray Tugay

21

vì vậy trong C # mã trông như sau:

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

hoặc là

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

trong JavaScript

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

Đối tượng từ điển C # chứa các phương thức hữu ích như dictionary.ContainsKey() trong JavaScript, chúng ta có thể sử dụng hasOwnPropertynhư

if (dictionary.hasOwnProperty("sample1"))
    console.log("sample1 key found and its value is"+ dictionary["sample1"]);

1
Upvote cho tôi không phải viết câu trả lời vềhasOwnProperty
brichins

18

Nếu bạn yêu cầu các khóa của bạn là bất kỳ đối tượng nào thay vì chỉ là chuỗi thì bạn có thể sử dụng jshashtable của tôi .


3
Tôi đã mất bao nhiêu giờ để loạng choạng về việc các đối tượng thực sự không thể được sử dụng làm khóa cho các mảng theo kiểu JS-đối tượng-liên kết trước khi tôi tìm thấy điều này? Cảm ơn bạn, Tim.
ericsoco

1
Flash / AS3 Dictionary, cùng với hầu hết các ngôn ngữ khác, hỗ trợ các tham chiếu đối tượng làm khóa. JavaScript vẫn chưa triển khai nó, nhưng tôi nghĩ rằng đó là một loại bản đồ trong tương lai. Một lần nữa với các polyfill trong khi đó; rất nhiều cho các tiêu chuẩn. Ồ, đợi đã ... cuối cùng vào năm 2015, Bản đồ dường như đã đến: stackoverflow.com/a/30088129/88409 và được hỗ trợ bởi các trình duyệt "hiện đại", lol: kangax.github.io/compat-table/es6/# Bản đồ (và không thực sự được hỗ trợ rộng rãi). Chỉ một thập kỷ sau AS3.
Triynko

Tim, có lẽ bạn nên cập nhật jshashtable để sử dụng Map () nếu có.
Dave Burton

1
@DaveBurton: Kế hoạch tốt. Tôi sẽ làm như vậy ngay khi tôi có thời gian.
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;
    }
}

1
Đối với những người đang bỏ phiếu này, bạn có thể vui lòng bình luận tại sao? Câu trả lời này đã được đăng vào năm 2011 và không phải trong ngày hiện tại.
Birey

2
Tôi đã không bỏ phiếu nhưng ... bạn không nên sử dụng một mảng làm đối tượng. Không chắc chắn 100% nếu đây là ý định của bạn. Sử dụng lát cắt trên mảng không xóa để lập chỉ mục lại; xóa là ok nhưng sẽ được đặt thành không xác định - tốt hơn là rõ ràng; use = không xác định trên một đối tượng quá b / c nó nhanh hơn (nhưng nhiều bộ nhớ hơn). Tóm lại: luôn luôn sử dụng một đối tượng: {}không phải là một mảng: []hoặc new Array()nếu bạn có ý định có các chuỗi chuỗi nếu không thì công cụ js có vấn đề - nó sẽ thấy 2 loại cho 1 biến có nghĩa là không tối ưu hóa hoặc nó sẽ chạy với mảng và nhận ra nó phải thay đổi thành đối tượng (có thể phân bổ lại).
Graeme Wicksted

2
Giống như câu trả lời của Alex Hawkins, vui lòng cung cấp một số giải thích tại sao mã tìm kiếm khá phức tạp này thực sự hữu ích và tốt hơn các câu trả lời ngắn hơn khác được đưa ra ở đây.
Thomas Tempelmann

6

Tôi đã tạo ra điều này để đạt được một số vấn đề, chẳng hạn như ánh xạ khóa đối tượng, khả năng liệt kê (với forEach()phương thức) và xóa.

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


Tài liệu của lớp Hashtable

Phương pháp:

  • get(key)
    Trả về giá trị liên quan đến khóa được chỉ định.
    Tham số ::
    key Khóa từ đó lấy giá trị.

  • put(key, value)
    Liên kết giá trị được chỉ định với khóa được chỉ định.
    Tham số ::
    key Chìa khóa liên kết giá trị.
    value: Giá trị để liên kết với khóa.

  • remove(key)
    Loại bỏ khóa được chỉ định với giá trị của nó.
    Tham số ::
    key Phím để loại bỏ.

  • clear()
    Xóa tất cả các hashtable, loại bỏ cả khóa và giá trị.

  • indexOfKey(key)
    Trả về chỉ mục của khóa được chỉ định, dựa trên thứ tự thêm.
    Tham số ::
    key Khóa trong đó lấy chỉ mục.

  • indexOfValue(value)
    Trả về chỉ mục của giá trị được chỉ định, dựa trên thứ tự thêm.
    Tham số ::
    value Giá trị lấy chỉ số.
    Ghi chú:
    Thông tin này được lấy theo indexOf()phương thức của một mảng, vì vậy nó so sánh đối tượng chỉ với toString()phương thức.

  • entryAt(index)
    Trả về một đối tượng có hai thuộc tính: khóa và giá trị, thể hiện mục nhập tại chỉ mục đã chỉ định.
    Tham số ::
    index Chỉ số của mục cần lấy.

  • containsKey(key)
    Trả về liệu hashtable có chứa khóa được chỉ định hay không.
    Thông số ::
    key Chìa khóa để kiểm tra.

  • containsValue(value)
    Trả về liệu hashtable có chứa giá trị được chỉ định hay không.
    Các tham số ::
    value Giá trị cần kiểm tra.

  • forEach(iterator)
    Lặp lại tất cả các mục trong chỉ định iterator.
    Tham số:
    value : Một phương pháp với 3 thông số: key, valueindex, nơi indexđại diện cho chỉ số của các mục nhập.

    Tính chất:

  • length (Chỉ đọc )
    Lấy số lượng mục trong hashtable.

  • keys (Chỉ đọc )
    Nhận một mảng của tất cả các khóa trong hàm băm.

  • values (Chỉ đọc )
    Nhận một mảng của tất cả các giá trị trong hàm băm.

  • entries (Chỉ đọc )
    Nhận một mảng của tất cả các mục trong hashtable. Chúng được biểu diễn dưới dạng tương tự của phương thức entryAt().


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

3
Có vẻ tốt đẹp. Bây giờ, xin vui lòng giải thích TẠI SAO điều này hữu ích và có thể phù hợp hơn tất cả các câu trả lời khác ở đây.
Thomas Tempelmann

1

Bạn có thể tạo một cái bằng cách sử dụng như sau:

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)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.