Ad olarak bir değişken kullanarak bir JavaScript nesnesine özellik eklensin mi?


277

Ben jQuery ile DOM öğeleri dışarı çekiyorum idve DOM öğesi kullanarak bir nesne üzerinde bir özellik ayarlamak istiyorum .

Misal

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

Eğer itemsFromDombir bir öğe içerir id"MyID" nin, istediğim obj"MyID" adında bir özellik olması. Yukarıdakiler bana veriyor name.

JavaScript kullanarak bir değişken kullanarak bir nesnenin özelliğine nasıl ad verebilirim?



Yanıtlar:


469

Bu eşdeğer sözdizimini kullanabilirsiniz:

obj[name] = value

122

ECMAScript 2015 ile bunu parantez notasyonunu kullanarak doğrudan nesne bildiriminde yapabilirsiniz:

var obj = {
  [key]: value
}

keyBir değer döndüren herhangi bir ifade (örneğin, bir değişken) nerede olabilir:

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

13
Bu soru, yeni bir nesne oluşturmak değil, mevcut nesneyi değiştirmekle ilgilidir.
Michał Perłakowski

28
Bu özel soru değiştirme ile ilgili olabilir, ancak dinamik olarak nesne oluşturma ile ilgili diğer sorular tarafından referansta bulunuldu ve bu yüzden buraya geldim ve bu cevaptan mutlu bir şekilde faydalandım.
Oliver Lloyd

2
@wOxxOm lol evet neden obj[name]=valueonun yerine sadece öneri kullanabilirsiniz zaman güçlük
geçeyim

2
ECMAScript 6'nın ne olduğundan emin değilim, ama çok takdir ediyorum
Arthur Tarasov

2
@ArthurTarasov: ECMAScript 6 daha resmi olarak ECMAScript 2015 ("ES2015") olarak da bilinir ve ECMAScript 6. baskı ("ES6") olarak adlandırılır. Haziran 2015'te yayınlanan JavaScript için şartname. O zamandan beri ES2016'mız oldu ve yakında ES2017 olacak, şimdi yıllık bir döngüde.
TJ Crowder

12

Bunun gibi nesnelerin listesini bile yapabilirsiniz

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

Nesne özelliklerine erişmek için iki farklı gösterim vardır

  • Nokta gösterimi: myObj.prop1
  • Köşeli ayraç notasyonu: myObj ["prop1"]

Nokta gösterimi hızlı ve kolaydır, ancak gerçek özellik adını açıkça kullanmanız gerekir . İkame, değişken vb. Yok.

Köşeli ayraç notasyonu açık uçlu. Bir dize kullanır, ancak herhangi bir yasal js kodu kullanarak dize üretebilirsiniz. Dizeyi değişmez olarak belirtebilirsiniz (bu durumda nokta gösterimi daha kolay okunur) veya bir değişken kullanabilir veya bir şekilde hesaplayabilirsiniz.

Yani, bunların hepsi prop1 adlı myObj özelliğini Hello değerine ayarlar :

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

tuzaklar:

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

tl; dnr : Anahtarı hesaplamak veya referans almak istiyorsanız , parantez gösterimini kullanmalısınız . Anahtarı açık bir şekilde kullanıyorsanız, basit açık kod için nokta gösterimini kullanın .

Not: Başka iyi ve doğru cevaplar var ama ben şahsen JS-the-fly quirkiness ile düşük bir aşina gelen biraz kısa buldum. Bu bazı insanlar için yararlı olabilir.


3

Lodash ile, bu _.set gibi yeni bir nesne oluşturabilirsiniz :

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

Veya şu şekilde mevcut bir nesneye ayarlayabilirsiniz:

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

Yolunuzda nokta (".") Kullanmak istiyorsanız dikkatli olmalısınız, çünkü lodash hiyerarşiyi ayarlayabilir, örneğin:

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

2

İlk olarak anahtarı değişken olarak tanımlamamız ve sonra nesne olarak anahtar olarak atamamız gerekir.

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



0

Bir nesneye dinamik olarak alan eklemek istiyorsanız, bunu yapmanın en basit yolu aşağıdaki gibidir:

 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
}

Bu, aşağıdaki alanlara sahip veri nesnesi oluşturur:

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

0

Nesneniz varsa, eşleme yerine anahtar dizisi oluşturabilir ve önceki nesne anahtarlarından ve değerlerden yeni nesne oluşturabilirsiniz.

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

0

ajavascript, javascript Object özelliklerini getirmek için iki tip ek açıklama içerir:

Obj = {};

1) (.) Ek açıklama örn. Obj.id, yalnızca nesnenin zaten 'id' adında bir özelliği varsa çalışır

2) ([]) ek açıklama örn. Obj [id] burada nesnenin 'id' adında herhangi bir özelliği yoksa, 'id' adında yeni bir özellik oluşturur.

aşağıdaki örnek için:

Obj [name] yazdığınızda her zaman yeni bir özellik oluşturulur. Ve özellik zaten aynı adla mevcutsa, onu geçersiz kılar.

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

Konu ile ilgili, özellikle jquery için değil. Bunu ec6 tepki projelerinde kullandım, belki birine yardım eder:

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

Not: Lütfen alıntı karakterine dikkat edin.



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

}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.