Dodać właściwość do obiektu JavaScript, używając zmiennej jako nazwy?

277

Wyciągam elementy z DOM za pomocą jQuery i chcę ustawić właściwość na obiekcie za pomocą idelementu DOM.

Przykład

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

Jeśli itemsFromDomzawiera element z id„myId”, chcę objmieć właściwość o nazwie „myId”. Powyższe daje mi name.

Jak nazwać właściwość obiektu za pomocą zmiennej za pomocą JavaScript?

Todd R.
źródło

Odpowiedzi:

469

Możesz użyć tej równoważnej składni:

obj[name] = value
CMS
źródło
122

Za pomocą ECMAScript 2015 możesz to zrobić bezpośrednio w deklaracji obiektu za pomocą notacji nawiasowej:

var obj = {
  [key]: value
}

Gdzie keymoże być dowolne wyrażenie (np. Zmienna) zwracające wartość:

var obj = {
  ['hello']: 'World',
  [x + 2]: 42,
  [someObject.getId()]: someVar
}
kube
źródło
13
To pytanie dotyczy modyfikacji istniejącego obiektu, a nie tworzenia nowego.
Michał Perłakowski,
28
To szczególne pytanie może dotyczyć modyfikacji, ale odwołują się do niego inne pytania dotyczące dynamicznego tworzenia obiektów, więc znalazłem się tutaj i chętnie skorzystałem z tej odpowiedzi.
Oliver Lloyd,
2
@wOxxOm lol tak, dlaczego miałbym męczyć się, obj[name]=valuekiedy mógłbym zamiast tego skorzystać z twojej sugestii
chiliNUT
2
Nie jestem pewien, czym jest ECMAScript 6, ale bardzo to doceniam
Arthur Tarasov
2
@ArthurTarasov: ECMAScript 6 jest bardziej formalnie nazywany ECMAScript 2015 („ES2015”), czyli ECMAScript 6. wydanie („ES6”). Jest to specyfikacja JavaScript wydana w czerwcu 2015 r. Od tego czasu mieliśmy ES2016, a wkrótce będziemy mieć ES2017, teraz są w cyklu rocznym.
TJ Crowder
12

Możesz nawet utworzyć listę takich obiektów

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);
});
dnxit
źródło
6

Istnieją dwie różne notacje umożliwiające dostęp do właściwości obiektu

  • Dot notacja: myObj.prop1
  • Uchwyt oznaczenia: myObj [ "prop1"]

Notacja kropka jest szybka i łatwa, ale musi korzystać z rzeczywistą nazwę właściwości wiążące. Bez podstawienia, zmiennych itp.

Notacja w nawiasach jest otwarta. Używa ciągu, ale można go utworzyć przy użyciu dowolnego legalnego kodu js. Możesz podać ciąg znaków jako dosłowny (chociaż w tym przypadku notacja kropkowa byłaby łatwiejsza do odczytania) lub użyć zmiennej lub obliczyć w jakiś sposób.

Wszystkie te ustawiają właściwość myObj o nazwie prop1 na wartość 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";     

Pułapki:

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

tl; dnr : Jeśli chcesz obliczyć lub odwołać się do klucza, musisz użyć notacji nawiasowej . Jeśli używasz klucza jawnie, użyj notacji kropkowej dla prostego, czystego kodu.

Uwaga: istnieją inne dobre i poprawne odpowiedzi, ale osobiście uważam je za krótkie, wynikające z małej znajomości dziwactwa JS w locie. Może to być przydatne dla niektórych osób.

jim brzoza
źródło
3

Za pomocą lodash możesz utworzyć nowy obiekt taki jak ten _.set :

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

Lub możesz ustawić istniejący obiekt w następujący sposób:

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

Powinieneś zachować ostrożność, jeśli chcesz użyć kropki („.”) Na swojej ścieżce, ponieważ lodash może ustawić hierarchię, na przykład:

_.set({}, "a.b.c", "d"); // { "a": { "b": { "c": "d" } } }
Momos Morbias
źródło
2

Najpierw musimy zdefiniować klucz jako zmienną, a następnie musimy na przykład przypisać klucz jako obiekt

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

KARTHIKEYAN.A
źródło
0

Jeśli chcesz dynamicznie dodawać pola do obiektu, najłatwiej to zrobić w następujący sposób:

 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
}

Spowoduje to utworzenie obiektu danych, który będzie miał następujące pola:

{k1:1, k2:2, k3:3}
Sruthi Poddutur
źródło
0

Jeśli masz obiekt, możesz tworzyć tablicę kluczy, a następnie mapować i tworzyć nowy obiekt z poprzednich kluczy obiektów i wartości.

Object.keys(myObject)
.map(el =>{
 const obj = {};
 obj[el]=myObject[el].code;
 console.log(obj);
});
Davo Mkrtchyan
źródło
0

ajavascript ma dwa typy adnotacji do pobierania właściwości obiektu javascript:

Obj = {};

1) (.) Adnotacja np. Obj.id zadziała to tylko wtedy, gdy obiekt ma już właściwość o nazwie „id”

2) ([]) adnotacja np. Obj [id] tutaj, jeśli obiekt nie ma żadnej właściwości o nazwie „id”, utworzy nową właściwość o nazwie „id”.

na przykład poniżej:

Nowa właściwość zostanie utworzona zawsze, gdy napiszesz Obj [nazwa]. A jeśli właściwość już istnieje o tej samej nazwie, zastąpi ją.

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;
    })
Priyanka Jain
źródło
0

Powiązane z tematem, ale nie specjalnie dla jquery. Użyłem tego w reakcjach projektów ec6, może pomaga komuś:

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

PS: Proszę zwrócić uwagę na cytat.

Javatar
źródło
-2

objectname.newProperty = value;

ARNAB
źródło
-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;

}
Shubham Asolkar
źródło