1. ホーム
  2. javascript

[解決済み] 辞書を作成し、キーと値のペアを動的に追加するには?

2022-03-24 16:51:55

質問

投稿から

JSON配列を送信し、Dictionary<string,string>.として受信する。

その投稿と同じことをやろうとしています。唯一の問題は、キーと値が何であるかを前もって知らないということです。だから、私は動的にキーと値のペアを追加することができるようにする必要があり、私はそれを行う方法がわからない。

そのオブジェクトを作成し、キーと値のペアを動的に追加する方法を知っている人はいますか?

試してみました。

var vars = [{key:"key", value:"value"}];
vars[0].key = "newkey";
vars[0].value = "newvalue";

しかし、これではうまくいきません。

どうすればいいですか?

var dict = []; // create an empty array

dict.push({
    key:   "keyName",
    value: "the value"
});
// repeat this last part as needed to add more key/value pairs

基本的には、2つのプロパティ(と呼ばれる)を持つオブジェクトリテラルを作成しています。 keyvalue を使用)し、それを挿入する。 push() ) を配列に挿入します。


編集する 5年近く経った今、この回答は「通常のJSオブジェクトリテラル(別名マップ、別名ハッシュ、別名辞書)を作成しない」という理由でダウンボートを受けています。
それは しかし、OPが求めた(リンク先の他の質問で例示されている)構造を作ること、それは オブジェクトリテラルの配列 で、それぞれ keyvalue プロパティがあります。なぜその構造が必要なのかは聞かないでください、でも求められたものなのです。

でも、でも、もしプレーンなJSオブジェクトに欲しいものがあれば - そして ではなく OPが要求した構造 - 参照 tcllの回答 しかし、有効なJS名である単純なキーを持つだけなら、ブラケット記法は少し面倒です。このようにすればいいのです。

// object literal with properties
var dict = {
  key1: "value1",
  key2: "value2"
  // etc.
};

また、オブジェクトを作成した後にプロパティを設定するには、通常のドットノテーションを使用します。

// empty object literal with properties added afterward
var dict = {};
dict.key1 = "value1";
dict.key2 = "value2";
// etc.

あなた する キーにスペースや特殊文字がある場合は、ブラケット記法が必要です。例えば、以下のような場合です。

var dict = {};

// this obviously won't work
dict.some invalid key (for multiple reasons) = "value1";

// but this will
dict["some invalid key (for multiple reasons)"] = "value1";

また、キーが動的な場合は、ブラケット記法も必要です。

dict[firstName + " " + lastName] = "some value";

キー(プロパティ名)は常に文字列であり、文字列でない値をキーとして使用すると、文字列に強制されることに注意してください。例えば Date オブジェクトはその文字列表現に変換されます。

dict[new Date] = "today's value";

console.log(dict);
// => {
//      "Sat Nov 04 2016 16:15:31 GMT-0700 (PDT)": "today's value"
//    }

しかし、多くのオブジェクトは以下のような文字列表現を持っているため、これは必ずしもうまくいかないことに注意してください。 "[object Object]" これは、一意でないキーにはなりません。ですから、次のような場合は注意が必要です。

var objA = { a: 23 },
    objB = { b: 42 };

dict[objA] = "value for objA";
dict[objB] = "value for objB";

console.log(dict);
// => { "[object Object]": "value for objB" }

にもかかわらず objAobjB は全く異なるユニークな要素ですが、どちらも同じ基本的な文字列表現を持っています。 "[object Object]" .

その理由 Date がこのような振る舞いをしないのは Date プロトタイプに、カスタム toString メソッドで、デフォルトの文字列表現をオーバーライドします。そして、あなたも同じことをすることができます。

// a simple constructor with a toString prototypal method
function Foo() {
  this.myRandomNumber = Math.random() * 1000 | 0;
}

Foo.prototype.toString = function () {
  return "Foo instance #" + this.myRandomNumber;
};

dict[new Foo] = "some value";

console.log(dict);
// => {
//      "Foo instance #712": "some value"
//    }

(ただし、上記では ランダム という数字があるため、名前の衝突が非常に起こりやすくなっています。の実装を説明するためのものです。 toString .)

そのため、オブジェクトをキーとして使おうとすると、JSはオブジェクトの自前の toString の実装がある場合はそれを使用し、ない場合はデフォルトの文字列表現を使用します。