เพิ่มคุณสมบัติให้กับวัตถุ JavaScript โดยใช้ตัวแปรเป็นชื่อหรือไม่


277

ฉันดึงรายการออกจาก DOM ด้วย jQuery และต้องการตั้งค่าคุณสมบัติบนวัตถุโดยใช้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
})

หากitemsFromDomรวมองค์ประกอบที่มีid"myId" ฉันต้องการobjมีคุณสมบัติชื่อ "myId" nameดังกล่าวข้างต้นให้ฉัน

ฉันจะตั้งชื่อคุณสมบัติของวัตถุโดยใช้ตัวแปรโดยใช้ JavaScript ได้อย่างไร



คำตอบ:



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 ฮ่า ๆ ๆ ทำไมฉันต้องผ่านความยุ่งยากobj[name]=valueเมื่อฉันสามารถใช้ข้อเสนอแนะของคุณแทน
chiliNUT

2
ฉันไม่แน่ใจว่า ECMAScript 6 คืออะไร แต่ฉันซาบซึ้งเป็นอย่างมาก
Arthur Tarasov

2
@ArthurTarasov: ECMAScript 6 เรียกอีกอย่างเป็นทางการว่า ECMAScript 2015 ("ES2015") หรือที่รู้จักในชื่อ ECMAScript รุ่นที่ 6 ("ES6") มันเป็นสเปคสำหรับ JavaScript ที่เปิดตัวมิถุนายน 2558 ตั้งแต่นั้นมาเรามี ES2016 และในไม่ช้าเราจะได้ ES2017 พวกเขากำลังอยู่ในรอบปี
TJ Crowder

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

มีสองสัญลักษณ์ที่แตกต่างกันในการเข้าถึงคุณสมบัติของวัตถุ

  • เครื่องหมายดอท : 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 on-the-fly quirkiness สิ่งนี้อาจเป็นประโยชน์กับบางคน


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

ก่อนอื่นเราต้องกำหนด key เป็นตัวแปรและจากนั้นเราต้องกำหนดให้เป็น key เป็นวัตถุตัวอย่างเช่น

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:

Obj = {};

1) (.) คำอธิบายประกอบเช่น Obj.id สิ่งนี้จะใช้ได้เฉพาะเมื่อวัตถุมีคุณสมบัติที่มีชื่อ 'id' อยู่แล้ว

2) ([]) คำอธิบายประกอบเช่น Obj [id] ที่นี่หากวัตถุไม่มีคุณสมบัติใด ๆ ที่มีชื่อ 'id' มันจะสร้างคุณสมบัติใหม่ที่มีชื่อ 'id'

ดังนั้นสำหรับตัวอย่างด้านล่าง:

คุณสมบัติใหม่จะถูกสร้างขึ้นเสมอเมื่อคุณเขียน Obj [ชื่อ] และถ้าคุณสมบัตินั้นมีอยู่แล้วด้วยชื่อเดียวกันมันจะแทนที่มัน

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

ปล.: โปรดระวังตัวละครที่พูด



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