web-dev-qa-db-ja.com

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

投稿から:

辞書として受け取るJSON配列を送信する<string、string>

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

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

私はもう試した:

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

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

257
KenEucker
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()を使用して)配列に挿入します。


Edit:だからほぼ5年後、この答えは「通常の」JSオブジェクトリテラル(別名マップ、別名ハッシュ、別名辞書)。
それはisですが、OPが要求した(およびリンクされている他の質問に示されている)構造を作成します。これはanオブジェクトリテラルの配列。それぞれkeyおよびvalueプロパティを持ちます。なぜその構造が必要なのかを聞かないでください、しかしそれが求められたものです。

しかし、しかし、あなたがプレーンJSオブジェクトに望むもの-そしてnot構造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.

スペース、特殊文字、またはそのようなものを含むキーがある場合は、doブラケット表記が必要です。例えば:

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

(上記ではrandom番号を使用しているため、名前の衝突は依然として非常に簡単に発生する可能性があります。toStringの実装を説明するためだけです。)

そのため、オブジェクトをキーとして使用しようとすると、JSはオブジェクトのtoString実装を使用するか、デフォルトの文字列表現を使用します。

472
Flambino
var dict = {};

dict['key'] = "testing";

console.log(dict);

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

コンソール出力:

Object {key: "testing"} 
357
Tcll

そのように簡単です:

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
52
Simon Sarris

あなたはあなたが辞書オブジェクトが欲しいと述べたので(そして 配列ではなく 私はいくらか理解していると思うように)私はこれがあなたが後にいるものだと思います:

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
32
ZenMaster

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
}

Fiddle

21

次のように、 Map を使ってマップを使うことができます。

var sayings = new Map();
sayings.set('dog', 'woof');
sayings.set('cat', 'meow');
10

私はたまたま似たようなものを探すためにこの質問を横切って歩いた。それは私が望んだ答えを得るためにテストを実行するのに十分な情報を与えてくれました。ですから、他の誰かが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' }
9
user2301449
var dictionary = {};//create new object
dictionary["key1"] = value1;//set key1
var key1 = dictionary["key1"];//get key1
8
SharpCoder

Dictionaryリストを簡単に操作できるように、Dictionaryクラスを作成できます。

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));
4
agonza1

私はこの問題に遭遇しました..しかしforループの中で。一番上の解決策は(プッシュ関数のパラメータに変数(そして文字列ではなく)を使うとき)うまくいきませんでした、そして他のものは変数に基づくキー値を説明しませんでした。私はこのアプローチ(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];
2
redcap3000

それはあなたの最終的な望ましい結果が何であるかを知るためにトンを助けるでしょうが、私はこれがあなたが望むものであると思います:

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

vars.Push({key: "newkey", value: "newvalue"})
2
g.d.d.c

現代のJavaScript(ES6/ES2015)では、辞書にはMapデータ構造を使うべきです。 ES6のMapデータ構造では、任意の値をキーとして使用できます。

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

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

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

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

辞書パターン

objects-as-maps

2

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

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);
2
Dan Dohotaru

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
WoodenKitty