web-dev-qa-db-ja.com

JSONオブジェクトに変数名と値のペアを動的に追加する

私のようなipsでいっぱいのjsonオブジェクトがあります

var ips = {}

次に、このオブジェクトにipオブジェクトを追加します。

ips[ipID] = {}

次に、各IPに動的/変数名の値のペアを追加する必要がありますので、このようなコードを使用しています

var name; var value; var temp = {};
tmp[name] = value

私の質問は、これらの名前値のペア/ tmpをipIDオブジェクトに追加して、結果が次のようになるようにする方法です

ipID = { name : value, anotherName : anotherValue }
57
Mike

それはJSONではありません。これは単なるJavaScriptオブジェクトであり、JSONとはまったく関係ありません。

括弧を使用して、プロパティを動的に設定できます。例:

var obj = {};
obj['name'] = value;
obj['anotherName'] = anotherValue;

これは、次のようなオブジェクトリテラルでオブジェクトを作成する場合とまったく同じです。

var obj = { name : value, anotherName : anotherValue };

オブジェクトをipsコレクションに既に追加している場合、1組のブラケットを使用してコレクション内のオブジェクトにアクセスし、別のペアを使用してオブジェクト内のプロパティにアクセスします。

ips[ipId] = {};
ips[ipId]['name'] = value;
ips[ipId]['anotherName'] = anotherValue;

上記のコードと似ていますが、objの代わりにips[ipId]を使用していることに注意してください。

コレクションからオブジェクトへの参照を取得し、それを使用して、オブジェクトがコレクション内にある間にオブジェクトにアクセスすることもできます。

ips[ipId] = {};
var obj = ips[ipId];
obj['name'] = value;
obj['anotherName'] = anotherValue;

文字列変数を使用して、プロパティの名前を指定できます。

var name = 'name';
obj[name] = value;
name = 'anotherName';
obj[name] = anotherValue;

プロパティを識別する変数の値(文字列)であるため、上記のコードでは両方のプロパティにobj[name]を使用しますが、どのプロパティになるかを決定するのは、アクセスした時点の変数の文字列ですアクセスしました。

164
Guffa

ECMAScript 6では、より良い方法があります。

オブジェクトプロパティ定義では、 計算されたプロパティ名 を使用できます。次に例を示します。

var name1 = 'John'; 
var value1 = '42'; 
var name2 = 'Sarah'; 
var value2 = '35';

var ipID = { 
             [name1] : value1, 
             [name2] : value2 
           }

これは、プロパティ名の変数がある次の例と同等です。

var ipID = { 
             John: '42', 
             Sarah: '35' 
           }
20
Dylan Hogg

javascriptオブジェクトを使用する場合、「ドット表記」を使用してアイテムを追加することもできます( JSLintが好む

var myArray = { name : "john" };
//will initiate a key-value array with one item "name" and the value "john"
myArray.lastName = "smith";
//will add a key named lastName with the value "smith"
//Object {name: "john", lastName: "smith"}

Chromeコンソールでのテストのスクリーンショットを次に示します

screenshot

7
Max

「ips」の各エントリには、複数の名前と値のペアを含めることができると想定しています。したがって、ネストされています。このデータ構造は次のように実現できます。

var ips = {}

function addIpId(ipID, name, value) {
    if (!ips[ipID]) ip[ipID] = {};
    var entries = ip[ipID];
    // you could add a check to ensure the name-value par's not already defined here
    var entries[name] = value;
}
5
orangepips

javascriptで。

    var myObject = { "name" : "john" };
    // { "name" : "john" };
    myObject.gender = "male";
    // { "name" : "john", "gender":"male"};
3
Atif Hussain

最初のJSONの理解が正しい場合、これらのソリューションのいずれかを使用すると、すべてのIP IDをループ処理し、それぞれに新しいオブジェクトを割り当てることができます。

// initial JSON
var ips = {ipId1: {}, ipId2: {}};

// Solution1
Object.keys(ips).forEach(function(key) {
  ips[key] = {name: 'value', anotherName: 'another value'};
});

// Solution 2
Object.keys(ips).forEach(function(key) {
  Object.assign(ips[key],{name: 'value', anotherName: 'another value'});
});

確認するには:

console.log(JSON.stringify(ips, null, 2));

上記の文は吐き出します:

{
  "ipId1": {
    "name":"value",
    "anotherName":"another value"
  },
  "ipId2": {
    "name":"value",
    "anotherName":"another value"
  }
}
1
Hamzeen Hameem

他の答えが提案していることから、これは役立つかもしれないと信じています:

var object = ips[ipId];
var name = "Joe";
var anothername = "Fred";
var value = "Thingy";
var anothervalue = "Fingy";
object[name] = value;
object[anothername] = anothervalue;

ただし、これはテストされておらず、次の一定の繰り返しに基づく仮定にすぎません。

object["string"] = value;
//object = {string: value}
1
user4953229

これを実現するには、Lodash_.assign 関数を使用します。

var ipID = {};
_.assign(ipID, {'name': "value"}, {'anotherName': "anotherValue"});
console.log(ipID);
<script src="https://cdn.jsdelivr.net/npm/[email protected]/lodash.min.js"></script>
0
Penny Liu