辞書を作成し、キーと値のペアを動的に追加する方法は?


323

投稿から:

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

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

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

私はもう試した:

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

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


2
それは素晴らしい働きをします。console.log(vars); show me [Object key: "newkey" value: "newvalue" proto:Object]
Alex Pliutau

それが辞書ではなくリストである場合を除いて:\データはのような「ペア」のリストとしても適切に表現されると思いますlist = [["key1","value1"],["key2","value2"]]。他のいくつかの言語には、「ペア」または「タプル」タイプがあります。実際の辞書追加のtldr:dict['key'] = "value"
ジョーダンスチュワート

回答:


552
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つのプロパティ(keyおよびと呼ばれるvalue)を持つオブジェクトリテラルを作成し、それを(を使用して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実装があればそれを使用するか、デフォルトの文字列表現を使用します。


2
それは連想的ですか?
Csaba Toth

1
@CsabaTothいいえ、dict連想辞書ではありません。これはオブジェクトの配列であり、それぞれが「キー」と「値」の2つのキーを持つ辞書のようなものです。
Roman Starkov

1
あなたが持っているのは、単に「dict」という名前の配列です。
Jan Kyu Peblik、2018

2
更新に感謝し、追加情報をフォローアップします。
ジェイコブ

410
var dict = {};

dict['key'] = "testing";

console.log(dict);

ちょうどpythonのように動作します:)

コンソール出力:

Object {key: "testing"} 

3
これは確かに辞書を構築するための最良のアプローチであり、正解です!
Roman

3
ブラケットを使用して初期化することは非常に重要{}ではなくカッコより
Jaider

このような基本的なオブジェクトも辞書として使用しています。それが正しい方法であることを確認してうれしい!
TKoL 2016

5
JavaScriptの「美しさ」!オブジェクトは、実際にはキーと値のペアのディクショナリ自体です
100r 2018年

1
@Azurespotキーはハッシュ可能なものであれば何でもかまいません。結局のところ、キーはハッシュによって順序付けられており、python3では実行ごとに異なります。
Tcll

53

そのように単純です:

var blah = {}; // make a new dictionary (empty)

または

var blah = {key: value, key2: value2}; // make a new dictionary with two pairs 

その後

blah.key3 = value3; // add a new key/value pair
blah.key2; // returns value2
blah['key2']; // also returns value2

1
@KenEucker私はこのような質問で間違った答えを持っていると便利だと思います。特に誰かが彼らが間違っている理由を説明する場合、それは良い学習リソースです。
CJBrew 2016

32

辞書オブジェクトが必要だと述べたので(私が理解していると思うような配列ではありません)、これがあなたが求めているものだと思います:

var input = [{key:"key1", value:"value1"},{key:"key2", value:"value2"}];

var result = {};

for(var i = 0; i < input.length; i++)
{
    result[input[i].key] = input[i].value;
}

console.log(result); // Just for testing

.pushを配列に使用する他の解決策は私の用途には有効ですが、試してみればこれも機能すると思います。
KenEucker 2011

2
私がDictionaryオブジェクトと誤解しない限り、質問は誤解を招きます。配列からキーで値をどのように取得しますか?
ZenMaster 2011

このオブジェクトでJSON.stringifyを使用してから、MVC 3のコントローラーでキャッチしています。これは、文字列化して送信する前に正しくフォーマットされるようにするためです。
KenEucker、2011

23

JavaScript Object それ自体が辞書のようなものです。ホイールを再発明する必要はありません。

var dict = {};

// Adding key-value -pairs
dict['key'] = 'value'; // Through indexer
dict.anotherKey = 'anotherValue'; // Through assignment

// Looping through
for (var item in dict) {
  console.log('key:' + item + ' value:' + dict[item]);
  // Output
  // key:key value:value
  // key:anotherKey value:anotherValue
}

// Non existent key
console.log(dict.notExist); // undefined

// Contains key?
if (dict.hasOwnProperty('key')) {
  // Remove item
  delete dict.key;
}

// Looping through
for (var item in dict) {
  console.log('key:' + item + ' value:' + dict[item]);
  // Output
  // key:anotherKey value:anotherValue
}

フィドル



9

私はたまたまこの質問を横断して、似たようなものを探しました。それは私が望んでいた答えを得るためにテストを実行するのに十分な情報を私に与えました。したがって、JavaScriptオブジェクトで{key: 'value'}ペアを動的に追加または検索する方法を他の誰かが知りたい場合、このテストは、知っておく必要があるかもしれないことすべてを教えてくれるはずです。

var dictionary = {initialkey: 'initialValue'};
var key = 'something';
var key2 =  'somethingElse';
var value = 'value1';
var value2 = 'value2';
var keyInitial = 'initialkey';

console.log(dictionary[keyInitial]);

dictionary[key] =value;
dictionary[key2] = value2;
console.log(dictionary);

出力

initialValue
{ initialkey: 'initialValue',
  something: 'value1',
  somethingElse: 'value2' }

2
これは問題ではありません。代わりに、質問をしてから自分で答えてください。それは理解と整理がはるかに簡単です。
SalmonKiller 2015年

1
ありがとう@SalmonKiller私は自分の質問を書いてそれが理解されることを期待するための適切な用語がわからなかったが、検索でこれに遭遇したが、すべての情報はそこにあったが、いくつかの回答の間に広がっていたので、この質問の概念に私と同じものを探してこの質問に
出くわした

1
笑。私はこれをレビューしていて、答えではなく質問のように見えました。ごめんね!
SalmonKiller 2015年

これを追加していただきありがとうございます。上記の答えのようにフィドルに入れることもできます。
KenEucker 2016年

8
var dictionary = {};//create new object
dictionary["key1"] = value1;//set key1
var key1 = dictionary["key1"];//get key1

追加のパフォーマンスについてkey1 = dictionary.key1は、インデックスではなく参照する必要がありますkey1 = dictionary["key1"]
Tcll

4

クラスディクショナリを作成すると、ディクショナリリストを簡単に操作できます。

class Dictionary {
  constructor() {
    this.items = {};
  }
  has(key) {
    return key in this.items;
  }
  set(key,value) {
    this.items[key] = value;
  }
  delete(key) {
    if( this.has(key) ){
      delete this.items[key]
      return true;
    }
    return false;
  }
}

var d = new Dictionary();
d.set(1, "value1")
d.set(2, "value2")
d.set(3, "value3")
console.log(d.has(2));
d.delete(2);
console.log(d.has(2));


3

キーと値のペアを作成するためのワンライナーはどうですか?

let result = { ["foo"]: "some value" };

reduce配列を辞書に動的に変換するようなイテレータ関数

var options = [
  { key: "foo", value: 1 },
  { key: "bar", value: {id: 2, name: "two"} },
  { key: "baz", value: {["active"]: true} },
];

var result = options.reduce((accumulator, current) => {
  accumulator[current.key] = current.value;
  return accumulator;
}, {});

console.log(result);


3

最新のJavaScript(ES6 / ES2015)では、辞書にMapデータ構造を使用する必要があります。ES6のマップデータ構造では、任意の値をキーとして使用できます。

const map = new Map();
map.set("true", 1);
map.set("false", 0);

ES5をまだ使用している場合、辞書を作成する正しい方法は、次の方法でプロトタイプなしでオブジェクトを作成することです。

var map = Object.create(null);
map["true"]= 1;
map["false"]= 0;

プロトタイプオブジェクトなしでディクショナリを作成することには多くの利点があります。以下のブログは、このトピックについて読む価値があります。

dict-pattern

マップとしてのオブジェクト


2

それはあなたの最終的な望ましい結果が何であるかを知るのに役立ちますが、これはあなたが望むものだと思います:

var vars = [{key:"key", value:"value"}];

vars.push({key: "newkey", value: "newvalue"})

2

私はこの問題に出くわしましたが、forループ内です。上の解決策は機能せず(push関数のパラメーターに変数(文字列ではなく)を使用する場合)で、他の解決策は変数に基づくキー値を考慮していませんでした。このアプローチ(phpで一般的)が機能することに驚きました。

  // example dict/json                  
  var iterateDict = {'record_identifier': {'content':'Some content','title':'Title of my Record'},
    'record_identifier_2': {'content':'Some  different content','title':'Title of my another Record'} };

  var array = [];

  // key to reduce the 'record' to
  var reduceKey = 'title';

  for(key in iterateDict)
   // ultra-safe variable checking...
   if(iterateDict[key] !== undefined && iterateDict[key][reduceKey] !== undefined)
    // build element to new array key
     array[key]=iterateDict[key][reduceKey];

1

の改善var dict = {}は使用することvar dict = Object.create(null)です。

これがない空のオブジェクトが作成されますではない持っているObject.prototypeことのプロトタイプとしての。

var dict1 = {};
if (dict1["toString"]){
    console.log("Hey, I didn't put that there!")
}
var dict2 = Object.create(null);
if (dict2["toString"]){
    console.log("This line won't run :)")
}

1

最初にアレイをグローバルに初期化

var dict = []

オブジェクトを辞書に追加

dict.push(
     { key: "One",value: false},
     { key: "Two",value: false},
     { key: "Three",value: false});

Output : 
   [0: {key: "One", value: false}
    1: {key: "Two", value: false}
    2: {key: "Three", value: false}]

辞書からオブジェクトを更新

Object.keys(dict).map((index) => {        
  if (index == 1){
    dict[index].value = true
  }
});

Output : 
   [0: {key: "One", value: false},
    1: {key: "Two", value: true},
    2: {key: "Three", value: false}]

辞書からオブジェクトを削除

Object.keys(dict).map((index) => {              
      if (index == 2){
        dict.splice(index)
      }
    });

Output : 
    [0: {key: "One", value: false},
     1: {key: "Two", value: true}]
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.