Thêm một thuộc tính cho một đối tượng JavaScript bằng cách sử dụng một biến làm tên?


277

Tôi đang rút các mục ra khỏi DOM bằng jQuery và muốn đặt thuộc tính trên một đối tượng bằng cách sử dụng idphần tử DOM.

Thí dụ

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

Nếu itemsFromDombao gồm một phần tử có id"myId", tôi muốn objcó một thuộc tính có tên là "myId". Ở trên cho tôi name.

Làm cách nào để đặt tên thuộc tính của một đối tượng bằng biến sử dụng JavaScript?



Câu trả lời:


469

Bạn có thể sử dụng cú pháp tương đương này:

obj[name] = value

122

Với ECMAScript 2015, bạn có thể thực hiện trực tiếp trong khai báo đối tượng bằng cách sử dụng ký hiệu ngoặc:

var obj = {
  [key]: value
}

Trường hợp keycó thể là bất kỳ loại biểu thức nào (ví dụ: một biến) trả về một giá trị:

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

13
Câu hỏi này là về việc sửa đổi đối tượng hiện có, không tạo ra một đối tượng mới.
Michał Perłakowski

28
Câu hỏi cụ thể này có thể là về sửa đổi nhưng nó được tham chiếu bởi các câu hỏi khác về việc tạo ra các đối tượng một cách linh hoạt và vì vậy tôi đã kết thúc ở đây và vui vẻ hưởng lợi từ câu trả lời này.
Oliver Lloyd

2
@wOxxOm lol yeah tại sao tôi lại gặp rắc rối obj[name]=valuekhi tôi chỉ có thể sử dụng đề xuất của bạn thay vào đó
chiliNUT 17/03/2017

2
Tôi không chắc ECMAScript 6 là gì, nhưng tôi đánh giá rất cao
Arthur Tarasov

2
@ArthurTaraov: ECMAScript 6 được gọi chính thức hơn là ECMAScript 2015 ("ES2015") hay còn gọi là ECMAScript phiên bản thứ 6 ("ES6"). Đó là thông số kỹ thuật cho JavaScript được phát hành vào tháng 6 năm 2015. Kể từ đó, chúng tôi đã có ES2016 và sắp tới chúng tôi sẽ có ES2017, giờ đây chúng đang trên một chu kỳ hàng năm.
TJ Crowder

12

Bạn thậm chí có thể tạo Danh sách các đối tượng như thế này

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

Có hai ký hiệu khác nhau để truy cập thuộc tính đối tượng

  • Ký hiệu dấu chấm : myObj.prop1
  • Ký hiệu khung : myObj ["prop1"]

Ký hiệu chấm là nhanh chóng và dễ dàng nhưng bạn phải sử dụng tên tài sản thực tế một cách rõ ràng. Không thay thế, biến, vv

Ký hiệu khung là kết thúc mở. Nó sử dụng một chuỗi nhưng bạn có thể tạo chuỗi bằng bất kỳ mã js hợp pháp nào. Bạn có thể chỉ định chuỗi là bằng chữ (mặc dù trong trường hợp này, ký hiệu dấu chấm sẽ đọc dễ dàng hơn) hoặc sử dụng một biến hoặc tính toán theo một cách nào đó.

Vì vậy, tất cả đều đặt thuộc tính myObj có tên prop1 thành giá trị 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";     

Cạm bẫy:

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

tl; dnr : Nếu bạn muốn tính toán hoặc tham chiếu khóa, bạn phải sử dụng ký hiệu ngoặc . Nếu bạn đang sử dụng khóa một cách rõ ràng, thì hãy sử dụng ký hiệu dấu chấm cho mã xóa đơn giản.

Lưu ý: có một số câu trả lời hay và chính xác khác nhưng cá nhân tôi thấy chúng hơi ngắn gọn đến từ mức độ quen thuộc thấp với sự khó hiểu của JS khi đang bay. Điều này có thể hữu ích cho một số người.


3

Với lodash, bạn có thể tạo đối tượng mới như thế này _.set :

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

Hoặc bạn có thể đặt thành đối tượng hiện có như thế này:

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

Bạn nên cẩn thận nếu bạn muốn sử dụng dấu chấm (".") Trong đường dẫn của mình, vì lodash có thể đặt cấu trúc phân cấp, ví dụ:

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

2

Đầu tiên chúng ta cần định nghĩa khóa là biến và sau đó chúng ta cần gán khóa là đối tượng.

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



0

Nếu bạn muốn thêm các trường vào một đối tượng một cách linh hoạt, cách đơn giản nhất để thực hiện như sau:

 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
}

Điều này sẽ tạo đối tượng dữ liệu có các trường sau:

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

0

Nếu bạn có đối tượng, bạn có thể tạo mảng các khóa, hơn là ánh xạ qua và tạo đối tượng mới từ các khóa và giá trị của đối tượng trước đó.

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

0

ajavascript có hai loại chú thích để tìm nạp các thuộc tính Đối tượng javascript:

Obj = {};

1) (.) Chú thích, vd. Obj.id điều này sẽ chỉ hoạt động nếu đối tượng đã có một thuộc tính có tên 'id'

2) ([]) chú thích, vd. Obj [id] ở đây nếu đối tượng không có bất kỳ thuộc tính nào có tên 'id', nó sẽ tạo một thuộc tính mới có tên 'id'.

ví dụ dưới đây:

Một thuộc tính mới sẽ được tạo luôn khi bạn viết Obj [name]. Và nếu thuộc tính đã tồn tại với cùng tên, nó sẽ ghi đè lên nó.

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

Liên quan đến chủ đề, không đặc biệt cho jquery mặc dù. Tôi đã sử dụng điều này trong các dự án phản ứng ec6, có thể giúp ai đó:

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

PS: Xin hãy chú ý đến nhân vật trích dẫn.



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

}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.