วิธีการตั้งค่าวัตถุ Javascript แบบไดนามิก?


99

เป็นการยากที่จะอธิบายกรณีด้วยคำพูดขอฉันยกตัวอย่าง:

var myObj = {
    'name': 'Umut',
    'age' : 34
};

var prop = 'name';
var value = 'Onur';

myObj[name] = value; // This does not work

eval('myObj.' + name) = value;   //Bad coding ;)

ฉันจะตั้งค่าคุณสมบัติตัวแปรด้วยค่าตัวแปรในออบเจ็กต์ JavaScript ได้อย่างไร



2
ดูใกล้ ๆ ดูเหมือนว่าคุณจะลืมปรับรหัส Cour myObj[prop] = value;มันควรจะเป็น eval('myObj.'+name)ไม่ทำงานเนื่องจากnameไม่มีตัวแปร
Felix Kling

7
คุณควรใช้varแป้นพิมพ์มากขึ้นในการประกาศตัวแปรใช้อัฒภาคให้มากขึ้นไม่ใช้evalและยอมรับคำตอบเพิ่มเติม เสร็จแล้ว
jAndy

คำถามของคุณเป็นข้อบกพร่อง - ที่ไม่ทำงาน แต่คุณทำผิดพลาด คุณเขียน " myObj[name]" เมื่อฉันค่อนข้างแน่ใจว่าคุณตั้งใจจะเขียน " myObj[prop]"
Ernest Friedman-Hill

คำตอบ:


153
myObj[prop] = value;

ที่ควรจะทำงาน คุณผสมชื่อของตัวแปรและค่าของตัวแปร แต่การสร้างดัชนีวัตถุด้วยสตริงเพื่อรับคุณสมบัติของมันทำงานได้ดีใน JavaScript


48
myObj.name=value

หรือ

myObj['name']=value     (Quotes are required)

ทั้งสองอย่างนี้ใช้แทนกันได้

แก้ไข:ฉันเดาว่าคุณหมายถึงmyObj[prop] = valueแทนที่จะเป็น myObj [name] = value ไวยากรณ์ที่สองทำงานได้ดี: http://jsfiddle.net/waitinforatrain/dNjvb/1/


1
หากคุณสมบัติอ็อบเจ็กต์เป็นคำสงวนต้องใช้ไวยากรณ์ที่สอง
timw4mail

แม้ว่าจะถูกต้อง แต่ก็ไม่ได้ตอบคำถามของเขาจริงๆ เขาสงสัยว่าจะทำอย่างไรเมื่อชื่อคุณสมบัติอยู่ในตัวแปร
Ernest Friedman-Hill

อัปเดตคำตอบที่นั่นคุณมีnameที่ที่คุณควรมีprop
bcoughlan

5

คุณจะได้รับทรัพย์สินในลักษณะเดียวกับที่คุณกำหนดไว้

foo = {
 bar: "value"
}

คุณตั้งค่า foo["bar"] = "baz";

เพื่อให้ได้ค่า foo["bar"]

จะคืนค่า "baz"


5

คุณยังสามารถสร้างสิ่งที่คล้ายกับออบเจ็กต์ค่า (vo);

SomeModelClassNameVO.js;

function SomeModelClassNameVO(name,id) {
    this.name = name;
    this.id = id;
}

กว่าจะทำได้;

   var someModelClassNameVO = new someModelClassNameVO('name',1);
   console.log(someModelClassNameVO.name);

3

เมื่อคุณสร้างวัตถุmyObjตามที่คุณมีให้คิดว่ามันเหมือนพจนานุกรมมากกว่า ในกรณีนี้จะมีสองปุ่มnameและage.

คุณสามารถเข้าถึงพจนานุกรมเหล่านี้ได้สองวิธี:

  • เช่นอาร์เรย์ (เช่นmyObj[name]); หรือ
  • เหมือนทรัพย์สิน (เช่นmyObj.name); โปรดทราบว่าคุณสมบัติบางอย่างถูกสงวนไว้ดังนั้นวิธีแรกจึงเป็นที่ต้องการ

คุณควรจะสามารถเข้าถึงเป็นทรัพย์สินได้โดยไม่มีปัญหาใด ๆ อย่างไรก็ตามในการเข้าถึงเป็นอาร์เรย์คุณจะต้องปฏิบัติต่อคีย์เหมือนสตริง

myObj["name"]

มิฉะนั้นจาวาสคริปต์จะถือว่าnameเป็นตัวแปรและเนื่องจากคุณยังไม่ได้สร้างตัวแปรที่เรียกว่าnameจึงไม่สามารถเข้าถึงคีย์ที่คุณต้องการได้


1
ยังคงมีความแตกต่างระหว่างmyObj[name]และmyObj.nameแม้ว่าเนื่องจากในอดีตอ้างถึงชื่อตัวแปรและตัวที่สองเป็นคีย์ตัวอักษร
pimvdb

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.