変数を名前として使用して、JavaScriptオブジェクトにプロパティを追加しますか?


277

jQueryを使用してDOMから項目を引き出しておりid、DOM要素のを使用してオブジェクトにプロパティを設定したいと考えています。

const obj = {}

jQuery(itemsFromDom).each(function() {
  const element = jQuery(this)
  const name = element.attr('id')
  const value = element.attr('value')

  // Here is the problem
  obj.name = value
})

「myId」のitemsFromDom要素が含まれている場合id、「myId」objという名前のプロパティが必要です。上記は私に与えますname

JavaScriptを使用して変数を使用してオブジェクトのプロパティに名前を付けるにはどうすればよいですか?



回答:


469

次の同等の構文を使用できます。

obj[name] = value

122

ECMAScriptの2015年、あなたは括弧表記を使用して、オブジェクトの宣言で直接それを行うことができます。

var obj = {
  [key]: value
}

ここでkey、値を返す任意の種類の式(変数など)を指定できます。

var obj = {
  ['hello']: 'World',
  [x + 2]: 42,
  [someObject.getId()]: someVar
}

13
この質問は、新しいオブジェクトを作成するのではなく、既存のオブジェクトを変更することに関するものです。
のMichałPerłakowski

28
この特定の質問は変更に関するかもしれませんが、動的にオブジェクトを作成することに関する他の質問によって参照されているので、私はここで終わり、この回答から幸いに恩恵を受けました。
Oliver Lloyd

2
@wOxxOm lolええ、なぜobj[name]=value私が代わりにあなたの提案を使うことができるときの面倒を経験するのでしょう
chiliNUT

2
ECMAScript 6が何であるかはわかりませんが、とても感謝しています
Arthur Tarasov

2
@ArthurTarasov:ECMAScript 6は、より正式にはECMAScript 2015( "ES2015")またはECMAScript 6th edition( "ES6")と呼ばれています。これは、2015年6月にリリースされたJavaScriptの仕様です。それ以降、ES2016があり、まもなくES2017が登場する予定ですが、現在は毎年循環しています。
TJクラウダー2017

12

このようなオブジェクトのリストを作成することもできます

var feeTypeList = [];
$('#feeTypeTable > tbody > tr').each(function (i, el) {
    var feeType = {};

    var $ID = $(this).find("input[id^=txtFeeType]").attr('id');

    feeType["feeTypeID"] = $('#ddlTerm').val();
    feeType["feeTypeName"] = $('#ddlProgram').val();
    feeType["feeTypeDescription"] = $('#ddlBatch').val();

    feeTypeList.push(feeType);
});

6

オブジェクトのプロパティにアクセスするには、2つの異なる表記法があります

  • ドット表記:myObj.prop1
  • ブラケット表記:myObj ["prop1"]

ドット表記は高速で簡単ですが、実際のプロパティ名を明示的に使用する必要があります。置換なし、変数など

ブラケット表記はオープンエンドです。文字列を使用しますが、正当なjsコードを使用して文字列を生成できます。文字列をリテラルとして指定するか(この場合はドット表記の方が読みやすくなります)、変数を使用するか、何らかの方法で計算します。

したがって、これらはすべて、prop1という名前のmyObjプロパティを値Helloに設定します

// quick easy-on-the-eye dot notation
myObj.prop1 = "Hello";

// brackets+literal
myObj["prop1"] = "Hello";

// using a variable
var x = "prop1"; 
myObj[x] = "Hello";                     

// calculate the accessor string in some weird way
var numList = [0,1,2];
myObj[ "prop" + numList[1] ] = "Hello";     

落とし穴:

myObj.[xxxx] = "Hello";      // wrong: mixed notations, syntax fail
myObj[prop1] = "Hello";      // wrong: this expects a variable called prop1

tl; dnr:キーを計算または参照する場合ブラケット表記を使用する必要あります。キーを明示的に使用している場合は、ドット表記を使用して単純な明確なコードを作成します。

注:他にもいくつかの適切な正解がありますが、私は、JSのオンザフライの癖に慣れていないことが原因で、少し簡単だと思っています。これは一部の人にとって役立つかもしれません。


3

lodashを使用すると、次のような新しいオブジェクトを作成できます_.set

obj = _.set({}, key, val);

または、次のように既存のオブジェクトに設定できます。

var existingObj = { a: 1 };
_.set(existingObj, 'a', 5); // existingObj will be: { a: 5 }

パスにドット( "。")を使用する場合は注意が必要です。たとえば、lodashは階層を設定できるためです。

_.set({}, "a.b.c", "d"); // { "a": { "b": { "c": "d" } } }

2

最初にキーを変数として定義する必要があり、次にキーをオブジェクトとして割り当てる必要があります。たとえば、

var data = {key:'dynamic_key',value:'dynamic_value'}
var key = data.key;
var obj = { [key]: data.value}
console.log(obj)



0

オブジェクトにフィールドを動的に追加する場合、最も簡単な方法は次のとおりです。

 var params= [
{key: "k1", value=1},
{key: "k2", value=2},
{key: "k3", value=3}];

for(i=0; i< params.len; i++) {
  data[params[i].key] = params[i].value
}

これにより、次のフィールドを持つデータオブジェクトが作成されます。

{k1:1, k2:2, k3:3}

0

オブジェクトがある場合は、マップしてからキーの配列を作成し、以前のオブジェクトキーと値から新しいオブジェクトを作成できます。

Object.keys(myObject)
.map(el =>{
 const obj = {};
 obj[el]=myObject[el].code;
 console.log(obj);
});

0

ajavascriptには、javascriptオブジェクトプロパティを取得するための2種類の注釈が​​あります。

Obj = {};

1)(。)アノテーション Obj.idこれは、オブジェクトにすでに「id」という名前のプロパティがある場合にのみ機能します

2)([])アノテーション(例)Obj [id]ここで、オブジェクトに「id」という名前のプロパティがない場合、「id」という名前の新しいプロパティが作成されます。

以下の例の場合:

Obj [name]を書き込むと、常に新しいプロパティが作成されます。また、同じ名前のプロパティがすでに存在する場合は、そのプロパティがオーバーライドされます。

const obj = {}
    jQuery(itemsFromDom).each(function() {
      const element = jQuery(this)
      const name = element.attr('id')
      const value = element.attr('value')
      // This will work
      obj[name]= value;
    })

0

特にjqueryではなく、件名に関連しています。私はこれをec6反応プロジェクトで使用しました、おそらく誰かを助けます:

this.setState({ [`${name}`]: value}, () => {
      console.log("State updated: ", JSON.stringify(this.state[name]));
    });

PS:引用文字を気にしてください。



-2
const data = [{
    name: 'BMW',
    value: '25641'
  }, {
    name: 'Apple',
    value: '45876'
  },
  {
    name: 'Benz',
    value: '65784'
  },
  {
    name: 'Toyota',
    value: '254'
  }
]

const obj = {
  carsList: [{
    name: 'Ford',
    value: '47563'
  }, {
    name: 'Toyota',
    value: '254'
  }],
  pastriesList: [],
  fruitsList: [{
    name: 'Apple',
    value: '45876'
  }, {
    name: 'Pineapple',
    value: '84523'
  }]
}

let keys = Object.keys(obj);

result = {};

for(key of keys){
    let a =  [...data,...obj[key]];
    result[key] = a;

}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.