programing

파이썬처럼 자바스크립트로 된 사전이 있습니까?

firstcheck 2023. 8. 21. 23:30
반응형

파이썬처럼 자바스크립트로 된 사전이 있습니까?

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

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

states_dictionary={ CT=[alex,harry], AK=[liza,alex], TX=[fred, harry] ........ }

자바스크립트에 그런 것이 있습니까?

이것은 오래된 게시물이지만, 저는 어쨌든 삽화가 들어간 답변을 제공해야 한다고 생각했습니다.

Javascript의 객체 표기법을 사용합니다.이와 같은 경우:

states_dictionary={ 
     "CT":["alex","harry"], 
     "AK":["liza","alex"], 
     "TX":["fred", "harry"]
};

값에 액세스하려면 다음을 수행합니다.

states_dictionary.AK[0] //which is liza

또는 javascript 리터럴 객체 표기법을 사용하여 키가 따옴표로 묶일 필요가 없습니다.

states_dictionary={ 
     CT:["alex","harry"], 
     AK:["liza","alex"], 
     TX:["fred", "harry"]
};

2015년까지는 Javascript에 실제 연상 배열이 없었습니다(ECMAScript 6 릴리스).그 이후로 지도 개체를 로보캣 상태로 사용할 수 있습니다.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에서 "객체 배열"에 액세스할 수 있습니다.

ECMA스크립트 6에서는 사전 구현인 공식 객체가 도입되었습니다.

let dict = new Map();
dict.set("foo", "bar");

//returns "bar"
dict.get("foo");

자바스크립트의 일반적인 객체와는 달리, ID 비교를 사용하여 임의의 객체를 키로 허용합니다.

let foo = {};
let bar = {};
let 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({});

사용자 정의 키 비교기를 사용할 방법이 없으므로 ID 비교를 원하지 않는 경우에도 일반 개체처럼 숫자 또는 문자열 키만 사용해야 합니다.

여기에서 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의 Key 및 Value를 개인 변수로 변환하여 몰래 사용할 수 있습니다.

이것이 도움이 되길 바랍니다!

EDIT >> 위를 구현한 후, 저는 개인적으로 JS 객체를 즉시 사용할 수 있는 연관 배열로 사용했습니다.

그러나 편리한 해시 테이블 경험을 만드는 데 실제로 도움이 되는 두 가지 방법에 대해 특별히 언급하고 싶습니다.

Viz: dict.hasOwnProperty(키) 및 delete dict[키]

이 게시물을 이 구현/사용에 대한 좋은 리소스로 읽으십시오.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.
  • 당신은 a의 사이즈를 얻을 수 있습니다.Map수동으로 크기를 추적해야 하는 동안 쉽게Object.

언급URL : https://stackoverflow.com/questions/3559070/are-there-dictionaries-in-javascript-like-python

반응형