이 같은 자바 스크립트로 사전을 만들어야합니다
정확한 표기법은 기억 나지 않지만 다음과 같습니다.
states_dictionary={ CT=[alex,harry], AK=[liza,alex], TX=[fred, harry] ........ }
자바 스크립트에 그런 것이 있습니까?
답변
이것은 오래된 게시물이지만 어쨌든 삽화가있는 답변을 제공해야한다고 생각했습니다.
자바 스크립트의 객체 표기법을 사용하세요. 이렇게 :
states_dictionary={
"CT":["alex","harry"],
"AK":["liza","alex"],
"TX":["fred", "harry"]
};
값에 액세스하려면 :
states_dictionary.AK[0] //which is liza
또는 자바 스크립트 리터럴 객체 표기법을 사용할 수 있습니다. 그러면 키가 따옴표로 묶일 필요가 없습니다.
states_dictionary={
CT:["alex","harry"],
AK:["liza","alex"],
TX:["fred", "harry"]
};
답변
2015 년 (ECMAScript 6 릴리스)까지 Javascript에는 실제 연관 배열이 없었습니다. 그 이후로 Map 객체를 Robocat 상태로 사용할 수 있습니다. MDN에서 세부 사항을 찾으십시오 . 예:
let map = new Map();
map.set('key', {'value1', 'value2'});
let values = map.get('key');
ES6에 대한 지원없이 객체를 사용해 볼 수 있습니다.
var x = new Object();
x["Key"] = "Value";
그러나 객체에서는 일반적인 배열 속성이나 array.length와 같은 메서드를 사용할 수 없습니다. 적어도 for-in-loop에서 “object-array”에 접근하는 것은 가능합니다.
답변
이것은 오래된 질문이라는 것을 알고 있지만 ‘자바 스크립트 사전’을 검색하면 Google에 팝업되므로 위의 답변에 ECMAScript 6에서 공식 Map
객체 인 사전이 도입되었다고 추가하고 싶습니다. 이행:
var dict = new Map();
dict.set("foo", "bar");
//returns "bar"
dict.get("foo");
자바 스크립트의 일반 객체와 달리 모든 객체를 키로 허용합니다.
var foo = {};
var bar = {};
var dict = new Map();
dict.set(foo, "Foo");
dict.set(bar, "Bar");
//returns "Bar"
dict.get(bar);
//returns "Foo"
dict.get(foo);
//returns undefined, as {} !== foo and {} !== bar
dict.get({});
답변
여기에 JS로 간단한 사전을 만들었습니다.
function JSdict() {
this.Keys = [];
this.Values = [];
}
// Check if dictionary extensions aren't implemented yet.
// Returns value of a key
if (!JSdict.prototype.getVal) {
JSdict.prototype.getVal = function (key) {
if (key == null) {
return "Key cannot be null";
}
for (var i = 0; i < this.Keys.length; i++) {
if (this.Keys[i] == key) {
return this.Values[i];
}
}
return "Key not found!";
}
}
// Check if dictionary extensions aren't implemented yet.
// Updates value of a key
if (!JSdict.prototype.update) {
JSdict.prototype.update = function (key, val) {
if (key == null || val == null) {
return "Key or Value cannot be null";
}
// Verify dict integrity before each operation
if (keysLength != valsLength) {
return "Dictionary inconsistent. Keys length don't match values!";
}
var keysLength = this.Keys.length;
var valsLength = this.Values.length;
var flag = false;
for (var i = 0; i < keysLength; i++) {
if (this.Keys[i] == key) {
this.Values[i] = val;
flag = true;
break;
}
}
if (!flag) {
return "Key does not exist";
}
}
}
// Check if dictionary extensions aren't implemented yet.
// Adds a unique key value pair
if (!JSdict.prototype.add) {
JSdict.prototype.add = function (key, val) {
// Allow only strings or numbers as keys
if (typeof (key) == "number" || typeof (key) == "string") {
if (key == null || val == null) {
return "Key or Value cannot be null";
}
if (keysLength != valsLength) {
return "Dictionary inconsistent. Keys length don't match values!";
}
var keysLength = this.Keys.length;
var valsLength = this.Values.length;
for (var i = 0; i < keysLength; i++) {
if (this.Keys[i] == key) {
return "Duplicate keys not allowed!";
}
}
this.Keys.push(key);
this.Values.push(val);
}
else {
return "Only number or string can be key!";
}
}
}
// Check if dictionary extensions aren't implemented yet.
// Removes a key value pair
if (!JSdict.prototype.remove) {
JSdict.prototype.remove = function (key) {
if (key == null) {
return "Key cannot be null";
}
if (keysLength != valsLength) {
return "Dictionary inconsistent. Keys length don't match values!";
}
var keysLength = this.Keys.length;
var valsLength = this.Values.length;
var flag = false;
for (var i = 0; i < keysLength; i++) {
if (this.Keys[i] == key) {
this.Keys.shift(key);
this.Values.shift(this.Values[i]);
flag = true;
break;
}
}
if (!flag) {
return "Key does not exist";
}
}
}
이제 위의 구현을 사용하여 사전을 다음과 같이 시뮬레이션 할 수 있습니다.
var dict = new JSdict();
dict.add(1, "one")
dict.add(1, "one more")
"Duplicate keys not allowed!"
dict.getVal(1)
"one"
dict.update(1, "onne")
dict.getVal(1)
"onne"
dict.remove(1)
dict.getVal(1)
"Key not found!"
이것은 단지 기본적인 시뮬레이션입니다. 최소한 O (nlogn) 시간 복잡도 이하에서 작동하도록 더 나은 실행 시간 알고리즘을 구현하여 더욱 최적화 할 수 있습니다. 배열에 대한 병합 / 빠른 정렬과 조회를위한 B 검색과 같습니다. JS에서 해시 함수 매핑에 대해 시도하거나 검색하지 않았습니다.
또한 JSdict obj의 키와 값을 비공개 변수로 변환하여 은밀하게 만들 수 있습니다.
도움이 되었기를 바랍니다!
편집 >> 위를 구현 한 후 개인적으로 JS 객체를 즉시 사용할 수있는 연관 배열로 사용했습니다.
그러나 편리한 해시 테이블 경험을 만드는 데 실제로 도움이 된 두 가지 방법에 대해 특별히 언급하고 싶습니다.
비주얼리 제이션 : dict.hasOwnProperty (key) 및 dict [key] 삭제
이 게시물을이 구현 / 사용에 대한 좋은 리소스로 읽으십시오.
JavaScript 연관 배열에서 동적으로 키 생성
감사!
답변
JavaScript 개체를 사용합니다. 사전의 키와 같은 속성에 액세스 할 수 있습니다. 이것이 JSON의 기초입니다. 구문은 Python 사전과 유사합니다. 참조 : JSON.org
답변
오래된 질문이지만 최근에 AS3> JS 포트를 수행해야했으며 속도를 위해 JS 용 간단한 AS3 스타일 사전 객체를 작성했습니다.
http://jsfiddle.net/MickMalone1983/VEpFf/2/
모르는 경우 AS3 사전을 사용하면 문자열이 아닌 모든 객체를 키로 사용할 수 있습니다. 용도를 찾으면 매우 편리합니다.
네이티브 개체만큼 빠르지는 않지만 그 점에서 중요한 문제를 발견하지 못했습니다.
API :
//Constructor
var dict = new Dict(overwrite:Boolean);
//If overwrite, allows over-writing of duplicate keys,
//otherwise, will not add duplicate keys to dictionary.
dict.put(key, value);//Add a pair
dict.get(key);//Get value from key
dict.remove(key);//Remove pair by key
dict.clearAll(value);//Remove all pairs with this value
dict.iterate(function(key, value){//Send all pairs as arguments to this function:
console.log(key+' is key for '+value);
});
dict.get(key);//Get value from key
답변
Firefox 13+는 파이썬 의 map
객체와 유사한 실험적인 객체 구현을 제공합니다 dict
. 여기에 사양이 있습니다 .
파이어 폭스에서만 사용할 수 있지만 new Object()
. 문서에서 인용 :
- 오브젝트에는 프로토 타입이 있으므로 맵에 기본 키가 있습니다. 그러나 이것은를 사용하여 우회 할 수 있습니다
map = Object.create(null)
.- 의 키
Object
는입니다Strings
. 여기서Map
.- 의 크기
Map
를 수동으로 추적해야하는 동안 쉽게 의 크기를 얻을 수 있습니다Object
.