your programing

JavaScript 해시 맵은 어떻게 구현됩니까?

lovepro 2020. 10. 15. 08:19
반응형

JavaScript 해시 맵은 어떻게 구현됩니까?


저는 현재 OpenLayers로 작업하고 있으며 벡터 레이어 (100000 개 이상의 벡터)에 그릴 수있는 방대한 데이터 세트를 가지고 있습니다.

이제 성능을 분석하기 위해이 모든 벡터를 JavaScript 해시 맵에 넣으려고합니다. JavaScript의 해시 맵이 어떻게 구현되었는지 알고 싶습니다. 실제 해시 함수입니까 아니면 단순한 데이터 구조와 검색 알고리즘을 사용하는 래핑 된 함수입니까?


모든 자바 스크립트 객체는 문자열 값만 키로 받아들이는 간단한 해시 맵이므로 코드를 다음과 같이 작성할 수 있습니다.

var map = {};
// add a item
map[key1] = value1;
// or remove it
delete map[key1];
// or determine whether a key exists
key1 in map;

자바 스크립트 객체는 구현시 실제 해시 맵이므로 검색의 복잡성은 O (1)이지만 hashcode()자바 스크립트 문자열 전용 기능 이 없으며 자바 스크립트 엔진 (V8, SpiderMonkey, JScript.dll 등)에 의해 내부적으로 구현됩니다. .)

그러나 오늘날 자바 스크립트는 문자열을 제외한 다른 데이터 유형을 키로 지원하지 않습니다. ECMAv6 (조화)는 모든 객체를 키로 허용하는 WeakMap 클래스를 도입하지만 시간이 오래 걸립니다.


자바 스크립트 객체는 해시 맵 위에서 만 구현할 수 없습니다.

브라우저 콘솔에서 다음을 시도하십시오.

var foo = {
    a: true,
    b: true,
    z: true,
    c: true
}

for (var i in foo) {
    console.log(i);
}

... 사실상 표준 동작 인 삽입 순서대로 다시받을 수 있습니다.

해시 맵은 본질적으로 순서를 유지하지 않으므로 JavaScript 구현은 어떻게 든 해시 맵을 사용할있지만, 해시 맵을 사용하는 경우 적어도 별도의 색인과 삽입을위한 추가 부기가 필요합니다.

다음은 v8이 객체를 구현하기 위해 해시 맵을 사용하지 않는 이유를 설명 하는 Lars Bak 의 비디오입니다 .


다음은 Java 과 유사한 것을 사용하는 쉽고 편리한 방법입니다 .

var map= {
    'map_name_1': map_value_1,
    'map_name_2': map_value_2,
    'map_name_3': map_value_3,
    'map_name_4': map_value_4
    }

그리고 가치를 얻으려면 :

alert( map['map_name_1'] );    // fives the value of map_value_1

......  etc  .....

이 클래스를 시도해야합니다 Map:

var myMap = new Map();

// setting the values
myMap.set("1", 'value1');
myMap.set("2", 'value2');
myMap.set("3", 'value3');

myMap.size; // 3

// getting the values
myMap.get("1");    // "value associated with "value1"
myMap.get("2");       // "value associated with "value1"
myMap.get("3");      // "value associated with "value3"

주의 : 키와 값은 모든 유형이 될 수 있습니다.

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map


평범한 오래된 JavaScript 객체는 맵으로 사용할 수 있지만 일반적으로 대부분의 브라우저와의 호환성을 위해 삽입 순서를 유지하는 방식으로 구현되므로 (Craig Barnes의 답변 참조) 따라서 단순한 해시 맵이 아닙니다.

ES6 적절한지도 (참조 소개 MDN 자바 스크립트지도 그중) 표준 말한다을 :

맵 개체는 해시 테이블 또는 평균적으로 컬렉션의 요소 수에 따라 하위 선형 인 액세스 시간을 제공하는 기타 메커니즘을 사용하여 구현되어야합니다.


<html>
<head>
<script type="text/javascript">
function test(){
var map= {'m1': 12,'m2': 13,'m3': 14,'m4': 15}
     alert(map['m3']);
}
</script>
</head>
<body>
<input type="button" value="click" onclick="test()"/>
</body>
</html>

I was running into the problem where i had the json with some common keys. I wanted to group all the values having the same key. After some surfing I found hashmap package. Which is really helpful.

To group the element with the same key, I used multi(key:*, value:*, key2:*, value2:*, ...).

This package is somewhat similar to Java Hashmap collection, but not as powerful as Java Hashmap.

참고URL : https://stackoverflow.com/questions/8877666/how-is-a-javascript-hash-map-implemented

반응형