JavaScript で辞書を作成し、キーと値のペアを動的に追加する方法 質問する

JavaScript で辞書を作成し、キーと値のペアを動的に追加する方法 質問する

投稿より:

Dictionary<string,string> として受信される JSON 配列を送信します。

私はその投稿と同じことをやろうとしています。唯一の問題は、キーと値が事前にわからないことです。そのため、キーと値のペアを動的に追加できる必要がありますが、その方法がわかりません。

そのオブジェクトを作成し、キーと値のペアを動的に追加するにはどうすればよいですか?

私はもう試した:

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

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

ベストアンサー1

使用:

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

key基本的には、2 つのプロパティ (および)を持つオブジェクト リテラルを作成しvalue、それを ( を使用push()) 配列に挿入します。


これは、「通常の」JavaScript オブジェクト リテラル (別名マップ、別名ハッシュ、別名辞書) を作成するわけではありません。ただし、OP が要求した構造 (リンクされている他の質問で説明されている) を作成します。これは、それぞれが および プロパティを持つオブジェクト リテラルの配列ですなぜその構造が必要なのかは聞かないでください。しかし、それが要求された構造です。keyvalue

しかし、あなたが望むのが単純なJavaScriptオブジェクトであり、OPが求めている構造ではない場合、tcllの回答ただし、有効な JavaScript 名である単純なキーだけがある場合は、括弧表記は少し面倒です。次のようにすればよいだけです。

// 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" }

objAと は完全に異なる固有の要素であるにもかかわらずobjB、どちらも同じ基本的な文字列表現を持ちます"[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。)

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

おすすめ記事