私はこのようなjavascriptで辞書を作成する必要があります
私は正確な表記を覚えていませんが、それは次のようなものでした:
states_dictionary={ CT=[alex,harry], AK=[liza,alex], TX=[fred, harry] ........ }
javascriptにそのようなことがありますか?
これは古い投稿ですが、とにかくイラスト付きの答えを提供すべきだと思いました。
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"]
};
JavaScriptには実際の連想配列はありません。オブジェクトを使用してみてください:
var x = new Object();
x["Key"] = "Value";
ただし、オブジェクトでは、典型的な配列プロパティやarray.lengthなどのメソッドを使用することはできません。少なくとも、for-in-loopで「オブジェクト配列」にアクセスすることは可能です。
ここで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)時間の複雑さ、またはそれ以下)で動作するように、より良い実行時間アルゴリズムを実装することにより、さらに最適化できます。 。JSのハッシュ関数のマッピングについて、試していないか、検索しませんでした。
また、JSdict objのキーと値をプライベート変数に変換して、巧妙にすることができます。
お役に立てれば!
編集>>上記を実装した後、JSオブジェクトをすぐに使用可能な連想配列として個人的に使用しました。
ただし、、実際に便利なハッシュテーブル体験にするのに役立つと証明された2つのメソッドについて特別に言及したいと思います。
Viz:dict.hasOwnProperty(key)anddelete dict [キー]
この実装/使用法に関する優れたリソースとして、この投稿をお読みください。 JavaScript連想配列でキーを動的に作成する
ありがとう!
これは古い質問ですが、「javascript辞書」を検索するとGoogleに表示されるため、上記の回答にECMAScript 6の公式Map
オブジェクトが追加されたことを追加します辞書の実装である導入:
var dict = new Map();
dict.set("foo", "bar");
//returns "bar"
dict.get("foo");
Javascriptの通常のオブジェクトとは異なり、任意のオブジェクトをキーとして使用できます。
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({});
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以降は、Pythonのmap
オブジェクトに似たdict
オブジェクトの実験的な実装を提供します。 ここの仕様 。
Firefoxでのみ使用可能ですが、new Object()
の属性を使用するよりも見栄えがよくなります。ドキュメントからの引用:
- オブジェクトにはプロトタイプがあるため、マップにはデフォルトのキーがあります。ただし、これは
map = Object.create(null)
を使用してバイパスできます。Object
のキーはStrings
であり、Map
の任意の値にすることができます。Map
のサイズを簡単に取得できますが、Object
のサイズを手動で追跡する必要があります。