[javascript] 파이썬과 같은 자바 스크립트에 사전이 있습니까?

이 같은 자바 스크립트로 사전을 만들어야합니다

정확한 표기법은 기억 나지 않지만 다음과 같습니다.

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.