2016-10-03 2 views
0

자바에서 hash table이 필요합니다. 즉, 키 (문자열)를 값에 매핑하는 연관 배열을 구현해야합니다 (제 경우에는 정수 배열입니다). 나는 이런 종류의 접근법은 일반적으로 사용되지 않는 것을 깨달았다, 또는 적어도 아직 웹에 그것을 발견되지 않은 :Javascript에서 해시 테이블 사용 : 적절한 배열 배열입니까?

var hash = ['s0']; 
 
for (var i = 5; i >= 1; i--) { 
 
    var r = Math.floor(Math.random() * 3); 
 
    hash['s'+i] = [r, r*2, r^2]; 
 
} 
 
console.log(hash); 
 
hash.forEach(function (v, i, a) { 
 
    document.getElementById('foreach').innerHTML += i + ' => ' + v + '<br>'; 
 
}) 
 
for (var i = 5; i >= 1; i--) { 
 
    var key = 's'+i; 
 
    document.getElementById('for').innerHTML += key + ' => [' + hash[key].toString() + ']<br>'; 
 
}
<p id="foreach">forEach (val,index):<br/></p> 
 
<p id="for">for:<br/></p>
사실로 인해 아마

가 선언 된 배열에 보인다 (콘솔을 열고 + 버튼을 클릭하면, [s1]을 표시하더라도 값이 표시됨을 알 수 있습니다). forEach은 배열에 하나의 값만 있다고 가정하고 있지만 해당 키 중 하나에 직접 액세스하면 hash['s3']의 경우 각 배열이 반환됩니다.

따라서 내가 잘못하고 있습니까? 이 접근법을 사용해야할까요?


JSON에서 개체가이 경우에 더 적합한 경우, 위의 예에 간단하고 비슷한을 구현하는 가장 좋은 방법은 무엇입니까?

또한 key_string이 "정식 매개 변수"가 아니기 때문에 hash.push(key_string: val_array) 키가 원하는 문자열 인 경우 hash.push(key_string: val_array)이 실패합니다. 그러나 뭔가를 수행하여

hash.push({'key':key_string,'value':val_array}) 

어떻게 그 배열 중 하나가 관련 키를 통해 가능한 한 가장 간단한 방법으로 액세스 할 수 있습니까?

+1

, javascript에서 해시 테이블을 구현하는 것은 해결하려는 문제를 해결하는 잘못된 방법이거나 숙제 문제입니다. – chiliNUT

+0

var hash = [ 's0']을 var hash = { 's0': 'first_element'}로 변경하십시오. 무엇을하는지보십시오. –

+0

감사합니다 @chiliNUT,하지만 객체 속성이 "해시 테이블과 거의 동일하게 작동"하고 "숙제 문제"로 "사소한 질문"이라고 말하면 간단한 대안을 제공 할 수 있습니까? 해시 테이블 문제? 위 코드와 비슷한 코드를 사용하고 있는데, 제 목적을 위해 작동하지만'forEach'를 사용할 수없는 것은 편리하지 않습니다 ... – CPHPython

답변

1

JavaScript 맵()을 사용할 수없는 이유는 무엇입니까?

MDN JavaScript Reference: Map

나는 아래의 코드 대신 배열의지도를 사용하도록 수정 :

var map = new Map(); 
 
for (var i = 5; i >= 1; i--) { 
 
    var r = Math.floor(Math.random() * 3); 
 
    map.set('s'+i, [r, r*2, r^2]); 
 
} 
 
console.log(map); 
 
map.forEach(function (v, i, m) { 
 
    document.getElementById('foreach').innerHTML += i + ' => ' + v + '<br>'; 
 
}) 
 
for (var i = 5; i >= 1; i--) { 
 
    var key = 's'+i; 
 
    document.getElementById('for').innerHTML += key + ' => [' + map.get(key).toString() + ']<br>'; 
 
}
<p id="foreach">forEach (val,index):<br/></p> 
 
<p id="for">for:<br/></p>
개체 속성이 해시 테이블 또는 연관 배열과 거의 같은 역할을 자바 스크립트

+0

좋아! 내가 누락 된 것이 있다는 것을 알았습니다! 진심으로 감사드립니다. – CPHPython

0

자바 스크립트의 객체 타입은 당신이 찾고있는 모든 행동에 대해 설명합니다

var obj = {}; 
for (var i = 5; i >= 1; i--) { 
    var r = Math.floor(Math.random() * 3); 
    obj['s'+i] = [r, r*2, r^2]; 
} 

자바 스크립트에서 개체 유형에 대한 좋은 점은 당신이 연관 배열과 같은 구문을 사용하거나 점 표기법을 사용하여 속성에 액세스 할 수 있습니다입니다 .

obj['key'] === obj.key 
0

콘솔에서이 예제를 확인하십시오.

Object.keys(hash).forEach(function (v, i, a) { 
    console.log(i , v, hash[v]); 
}) 
:
var hash = {'s0':' '}; 
for (var i = 5; i >= 1; i--) { 
    var r = Math.floor(Math.random() * 3); 
    hash['s'+i] = [r, r*2, r^2]; 
} 

해시 객체가 이제 배열로 객체의 키를 추출하고이를 반복 할 수 대해 forEach와 객체에 액세스하려면 키와 값의 매핑

console.log(hash); 

포함되어 있음을 볼 수

컬렉션에 대한 여러 가지 일반적인 작업을 구현하는 https://lodash.com/과 같은 라이브러리를 사용할 수도 있습니다.

+0

이 코드가 OP에 도움이되는 이유에 대한 설명을 추가하십시오. 이렇게하면 미래의 시청자가 배울 수있는 답을 제공하는 데 도움이됩니다. 자세한 내용은 [답변]을 참조하십시오. –

관련 문제