web-dev-qa-db-ja.com

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

私はjQueryを使ってDOMからアイテムを取り出していて、DOM要素のidを使ってオブジェクトのプロパティを設定したいです。

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
})

itemsFromDomidが "myId"の要素が含まれている場合、objに "myId"という名前のプロパティを設定します。上記は私にnameを与えます。

JavaScriptを使用して変数を使用してオブジェクトのプロパティに名前を付ける方法を教えてください。

244
Todd R

これと同等の構文を使用できます。

obj[name] = value
437
CMS

ECMAScript 2015 を使うと、括弧記法を使ってオブジェクト宣言で直接行うことができます。

var obj = {
  [key]: value
}

keyは、値を返す任意の種類の式(変数など)にすることができます。

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

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

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);
});
11
dnxit

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" } } }
3
Momos Morbias

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

  • ドット表記:myObj.prop1
  • 大括弧表記:myObj ["prop1"]

ドット表記は高速で簡単ですが、あなたは必須明示的に実際のプロパティ名を使用してください。無置換、変数など.

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

そのため、これらはすべてmyObjという名前のprop1という値を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のオンザフライの癖に慣れていないことから少し短いことを思い出しました。これは何人かの人々にとって役に立つかもしれません。

2
jim birch

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

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

ES2015の出現により、 Object.assign および 計算されたプロパティ名 というOPコードが次のようにまとめられました。

var obj = Object.assign.apply({}, $(itemsFromDom).map((i, el) => ({[el.id]: el.value})));
1
wOxxOm

objectname.newProperty = value;

1
ARNAB

動的にオブジェクトにフィールドを追加したい場合は、次のようにします。

 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
Sruthi Poddutur
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;

}
0
Shubham Asolkar

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

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

wOxxOmという回答に基づくと、これは使用例です。

const data = [
    {"id": "z1", "val":10},
    {"id": "z2", "val":20},
    {"id": "z3", "val":30}
];
    
const obj = Object.assign.apply({}, data.map((el, i) => ({[el.id]: el.val})));

console.log(obj);
0
robe007