JavaScript에서 연관 배열 / 해싱을 수행하는 방법


574

C #에서와 같이 JavaScript를 사용하여 일부 통계를 저장해야합니다.

Dictionary<string, int> statistics;

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

이 생길인가 Hashtable또는 뭔가처럼 Dictionary<TKey, TValue>자바 스크립트?
어떻게 그런 식으로 값을 저장할 수 있습니까?


1
js는 느슨하게 입력되었으므로 문자열 또는 int를 선언하는 방법이 없습니다. var를 선언하고 문자열 또는 int를 지정할 수 있습니다. : D
Gordon Gustafson

xDict를 확인하고 싶을 수도 있습니다. jsfiddle.net/very/MuVwd 사전 String => Javascript로 작성된 모든 것입니다.
Robert


허용되는 답변은 2009 년에 작성되었으며 문자열 키만 지원 합니다 . 문자열이 아닌 키의 경우 Vitalii의 답변에서와 같이 Map 또는 WeakMap을 사용하십시오 .
ToolmakerSteve

답변:


564

JavaScript 객체를 연관 배열로 사용하십시오 .

연관 배열 : 간단히 말해서 연관 배열은 정수 대신 정수를 인덱스로 사용합니다.

로 객체 만들기

var dictionary = {};

Javascript를 사용하면 다음 구문을 사용하여 객체에 속성을 추가 할 수 있습니다.

Object.yourProperty = value;

동일한 대체 구문은 다음과 같습니다.

Object["yourProperty"] = value;

다음 구문을 사용하여 키-값 객체 맵을 만들 수도있는 경우

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

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

다음과 같이 for..in 루프 구문을 사용하여 연관 배열을 반복 할 수 있습니다.

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

36
"연관 배열"을 초기화하는 저자의 접근 방식 new Array()은 눈살을 찌푸리게한다. 이 기사는 결국 단점을 언급하고 제안 new Object()또는 {}선호하는 대안하지만, 끝 부분이의와 나는 대부분의 독자는 지금까지 그을받지 않습니다 우려하고있다.
Daniel Lubarov

23
불합격. JavaScript는 객체 참조를 키로 지원하지 않지만 Flash / AS3 Dictionary와 같은 것은 지원합니다. JavaScript에서는 var obj1 = {}; var obj2 = {}; var table= {}; table[obj1] = "A"; table[obj2] = "B"; alert(table[obj1]); //displays B키 obj1과 obj2를 구분할 수 없기 때문에; 둘 다 문자열로 변환되어 "Object"와 같이됩니다. 자바 스크립트에서는 전체 실패 및 참조 및 순환 참조를 사용하여 형식에 안전한 직렬화가 그대로 유지됩니다. Flash / AS3에서는 쉽습니다.
Triynko

음, 우리는 평등을 확인하거나이 정의하여 유효성을 검사 할 수 있습니다 JS있는 유일한 방법은 동일 이런 일에 의해 방법 : Point.prototype.equals = function(obj) { return (obj instanceof Point) && (obj.x === this.x) && (obj.y === this.y); };
나딤

1
@Leo console.log ({A : 'B', C : 'D'} [foo])는 A B를 제공해야합니다.
ychaouche

2
@Leo 예제가 잘못된 것 같습니다. for... in사전이 키를 반복하기 때문에 Object.keys잘못된 위치에있는 것 같습니다. Object.keys사전의 키들의 배열을 반환하고, for... in위에 배열 루프에 대한 배열 자사 인덱스 아니라 그 값인 "키".
JHH

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

객체 지향 언어에서 오는 경우이 기사를 확인해야합니다 .


38
더 적은 줄로도이 작업을 수행 할 수 있습니다. var associativeArray = { "one": "First", "two": "second", "three": "Third"}; 그런 다음 associativeArray [ "one"]은 "First"를 반환하고 assocativeArray [ "four"]는 null을 반환합니다.
Tony Wickham 1

2
죄송합니다 @JuusoOhtonen, 나는 6 년 전 게시물을 썼습니다 (시간이 얼마나 빨리 지나가는지는 믿어지지 않습니다). 링크를 업데이트했습니다. 그것을 확인하고 의심이 있으시면 주저하지 말고
Dani Cricco

145

모든 최신 브라우저는 자바 스크립트 객체를 지원 합니다. 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을 사용하십시오 .


5
희망적으로 몇 년 안에 이것이 가장 많이 투표 될 것입니다.
Cameron Lee

1
@CameronLee 틀림없이
Loïc Faure-Lacroix

1
이것은 Map키가 객체 일 때 유용하지만 참조가 아닌 값으로 비교해야합니다.
Siyuan Ren

7
이 답변이 작성된 후 1 년 이상이 지난 후에도 "모든 최신 브라우저가 Map을 지원"하는 것은 사실이 아닙니다. 데스크탑에서만 최소한 기본 맵 지원을 기대할 수 있습니다. 휴대 기기에는 없습니다. 예를 들어, Android 브라우저에는지도 지원이 전혀 없습니다. 데스크탑에서도 일부 구현은 불완전합니다. 예를 들어, IE11은 여전히 ​​"for ... of ..."를 통한 열거를 지원하지 않으므로 IE 호환성을 원한다면 역겨운 .forEach kludge를 사용해야합니다. 또한 JSON.stringify ()는 내가 시도한 모든 브라우저에서 Map에서 작동하지 않습니다. 또한 초기화 프로그램은 IE 또는 Safari에서 작동하지 않습니다.
Dave Burton

3
뛰어난 브라우저 지원이 있습니다. 다시 확인하십시오. 어쨌든 이것은 폴리 필하기가 매우 쉽기 때문에 기본 브라우저 지원은 문제가되지 않습니다.
Brad

132

특별한 이유가없는 한, 일반 객체 만 사용하십시오. Javascript의 객체 속성은 해시 테이블 스타일 구문을 사용하여 참조 할 수 있습니다.

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

그러면 요소 foobar요소를 모두 다음과 같이 참조 할 수 있습니다.

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

물론 이것은 키가 문자열이어야 함을 의미합니다. 문자열이 아닌 경우 내부적으로 문자열로 변환되므로 여전히 작동합니다 (YMMV).


1
정수로서의 키는 아무런 문제를 일으키지 않았습니다. stackoverflow.com/questions/2380019/…
Jonas Elfström

10
Jonas : 속성이 설정 될 때 정수는 문자열로 변환됩니다. var hash = {}; hash[1] = "foo"; alert(hash["1"]);alerts "foo".
Tim Down

17
키 중 하나가 " proto "또는 " parent "인 경우 어떻게합니까?
PleaseStand

5
JavaScript 에서는 객체를 키로 사용할 수 없습니다 . 글쎄, 가능하지만 문자열 표현으로 변환되므로 모든 객체가 정확히 동일한 키로 끝납니다. 아래 @TimDown의 jshashtable 제안을 참조하십시오.
ericsoco

21
두 개의 인스턴스에서 foo와 bar를 키와 값으로 사용하기 때문에이 예제는 혼란 스럽습니다. 것을 보여주기 위해 많은 명확 var dict = {}; dict.key1 = "val1"; dict["key2"] = "val2";DICT의 키 1 요소는 모두 동등하게 참조 할 수 있습니다 dict["key1"]dict.key1.
Jim

49

JS의 모든 객체는 해시 테이블처럼 동작하며 일반적으로 해시 테이블로 구현되기 때문에 그와 함께합니다.

var hashSweetHashTable = {};

26
"hashtable"의 값에 실제로 액세스하는 방법을 보여주지 않기 때문에 하향 조정됩니다.
IQAndreas

나는 9 년 늦었습니다 (프로그래밍에 대해 많이 알지 못했습니다.이 사이트는 물론 이었지만) .... 당신이지도에 포인트를 저장하려고하고 무언가가 이미 있는지 확인 해야하는 경우 지도상의 어느 지점에서? 이 경우 좌표 ( 문자열이 아닌 객체)로 조회하기 위해 HashTable을 사용하는 것이 가장 좋습니다 .
Mike Warren

@MikeWarren if (hashSweetHashTable.foo)은 if 블록 if foo가 설정되어 있어야합니다 .
Koray Tugay 1

21

C #에서 코드는 다음과 같습니다.

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

또는

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

JavaScript로

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

C #을 사전 개체는 같은 유용한 방법이 포함되어 dictionary.ContainsKey() 자바 스크립트에서 우리가 사용할 수 hasOwnProperty처럼를

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

1
다음에 대한 답변을 쓸 필요가 없습니다.hasOwnProperty
brichins

18

키가 문자열이 아닌 객체가되어야하는 경우 내 jshashtable을 사용할 수 있습니다 .


3
내가 이것을 발견하기 전에 Objects를 JS-style-Object-as-associative-arrays의 키로 사용할 수 없다는 사실을 둘러싼 몇 시간을 보냈습니까? 고마워 팀
ericsoco

1
Flash / AS3 사전은 대부분의 다른 언어와 함께 객체 참조를 키로 지원합니다. JavaScript는 아직 아직 구현하지 않았지만 앞으로는 일종의 Map 클래스라고 생각합니다. 그 동안 다시 폴리 필로; 표준을 위해 너무 많은. 아, 잠깐만 요 ... 마침내 2015 년에 Mapover 가 도착한 것으로 보입니다 : stackoverflow.com/a/30088129/88409 , "modern"브라우저, lol : kangax.github.io/compat-table/es6/# 지도 (그리고 실제로 널리 지원되지는 않음). AS3보다 10 년이 늦었습니다.
Triynko

Tim, 가능하다면 Map ()을 사용하도록 jshashtable을 업데이트해야 할 것입니다.
Dave Burton

1
@DaveBurton : 좋은 계획입니다. 시간이 있으면 바로하겠습니다.
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
투표에 참여하지 않는 사람들을 위해, 왜 그런지 언급 해 주시겠습니까? 이 답변은 2011 년에 게시되었으며 현재 날짜는 아닙니다.
Birey

2
나는 투표하지 않았지만 ... 배열을 객체로 사용해서는 안됩니다. 이것이 당신의 의도인지 100 % 확실하지 않습니다. 배열에서 슬라이스를 사용하여 다시 색인화하지 마십시오. 삭제는 정상이지만 정의되지 않은 상태로 설정됩니다. 명시 적으로하는 것이 좋습니다. 너무 = /하지만 메모리가 더 많은 객체에서 = undefined를 사용하십시오. 간단히 말하면 : 항상 {}배열이 아닌 객체를 사용하십시오 . []또는 new Array()문자열 키를 사용하려는 경우 js 엔진에 문제가 있습니다 .1 변수에 대해 2 가지 유형이 표시됩니다. 즉 최적화가 없거나 배열로 실행되고 실현됩니다. 개체로 변경해야합니다 (재 할당 가능).
Graeme Wicksted

2
Alex Hawkins의 답변과 마찬가지로이 복잡한 코드가 실제로 다른 짧은 답변보다 유용하고 더 나은 이유를 설명하십시오.
토마스 TEMPELMANN

6

객체 키 매핑, 열거 기능 ( 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)
    지정된 인덱스의 항목을 나타내는 키와 값의 두 가지 속성을 가진 객체를 반환합니다.
    파라미터 :
    index : 취득하는 엔트리의 인덱스.

  • containsKey(key)
    해시 테이블에 지정된 키가 포함되어 있는지 여부를 반환합니다.
    매개 변수 :
    key : 점검 할 키.

  • containsValue(value)
    해시 테이블에 지정된 값이 포함되어 있는지 여부를 반환합니다.
    매개 변수 :
    value : 점검 할 값.

  • forEach(iterator)
    지정된의 모든 항목을 반복합니다 iterator.
    파라미터 :
    value : 3 파라미터들에있어서 key, valueindex, index항목의 인덱스를 나타낸다.

    속성 :

  • length ( 읽기 전용 )
    해시 테이블의 항목 수를 가져옵니다.

  • keys ( 읽기 전용 )
    해시 테이블의 모든 키 배열을 가져옵니다.

  • values ( 읽기 전용 )
    해시 테이블의 모든 값 배열을 가져옵니다.

  • entries ( 읽기 전용 )
    해시 테이블의 모든 항목 배열을 가져옵니다. 그것들은 같은 형식의 메소드로 표현됩니다 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
좋아 보인다. 자, 이것이 왜 유용하며 여기에있는 다른 모든 대답보다 더 적합한 이유를 설명하십시오.
토마스 TEMPELMANN

1

다음과 같은 방법으로 만들 수 있습니다.

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)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.