2012-03-14 28 views

Trả lời

58

Bởi vì "key" + test là một biểu thức chứ không phải là số nhận dạng cũng như chuỗi ký tự cũng như chữ số, là những thứ duy nhất được phép làm khóa trong một đối tượng theo nghĩa đen.

Bạn phải sử dụng các [] ký hiệu sau khi tạo đối tượng cho một phím năng động như:

var test123 = {}; 
test123["key" + test] = 123; 

Một định danh về cơ bản là tập hợp con cùng các ký tự mà bạn có thể gọi một biến (chữ cái, số, _$; không được bắt đầu bằng số) và chuỗi ký tự là bất kỳ chuỗi nào kèm theo ' hoặc ".

Vì vậy, các loại duy nhất của phím bạn có thể sử dụng trong một đối tượng theo nghĩa đen là:

{ 
    a0: true, // valid identifier 
    $$_: true, // same 
    123: true, // valid numeric literal 
    012: true, // same (octal) 
    0xf: true, // same (hex) 
    "@": true, // not allowed as an identifier 
    '0a': true // same 
} 

tham khảo: http://es5.github.com/#x11.1.5.

PropertyName:

IdentifierName

StringLiteral

NumericLiteral

+3

Ngoài ra, các số được cho phép trong đối tượng theo nghĩa đen, chẳng hạn như '0' hoặc' 5e10' (nhưng không phải '-10' vì' -' không phải là một phần của chữ số nhưng toán tử '-' đơn nhất). –

+0

@Felix Kling: Thật vậy, họ cảm ơn. – pimvdb

10

Bạn có thể nhưng không phải với ký hiệu chữ (trước ES6).

var test123 = {}; 
test123["foo" + "bar"] = 'baz'; 

test123.foobar === 'baz'; // true 
+0

Cảm ơn câu trả lời đơn giản, đó chỉ là những gì tôi đang tìm kiếm :) –

3

Mã của bạn tương đương với test123.("key" + test) = 123, điều này có thể giúp bạn hiểu tại sao nó sai.

Bạn cần ["name"] ký hiệu để có thể truy cập các trường theo tên của chúng theo chuỗi. Các ký hiệu khác (của bạn và . một) yêu cầu mã định danh.

-3
--HTML-- 
<div id="name1"></div> 
<div id="name2"></div> 
<div id="name3"></div> 

--JS-- 
    function getJsonData(){ 
    var hr = new XMLHttpRequest(); 
    hr.open("GET", "bookJson.json", true); 
    hr.setRequestHeader("Content-type", "application/json", true); 
    hr.onreadystatechange = function() { 
    if(hr.readyState == 4 && hr.status == 200) { 

    var data = JSON.parse(hr.responseText); 
    for(var i=0;i<3;i++){ 
    var a = "p"+(i+1)+"H"; 
    $("#name"+(i+1)).html(data[objName][a]); 
    } 


    } 

} 
    hr.send(null); 
} 

---JSON--- save JSON file name as bookJson.json 
{ "objName": 
    { 
    "p1H":"content1", 
    "p2H":"content2", 
    "p3H":"content3", 
    } 
    } 
----------------------------------- 
json object key name p1H,p2H,p3H ... 
We want to dynamically get this keys in javacript instead of **data[objName].p1H**. you can get dynamical key like **data[objName]["p1H"]** 
+0

Vui lòng cung cấp giải thích về câu trả lời của bạn để giúp người dùng khác của trang web. Câu trả lời chỉ có mã không phải là rất hữu ích và có xu hướng được đánh dấu là chất lượng thấp và có khả năng bị xóa. – Tristan

+0

Cảm ơn bạn đã đề xuất, tôi đã cung cấp giải thích về câu trả lời của tôi ... –

1

Javascript cung cấp hai cách để xác định một tài sản của một đối tượng:

  1. object.propertyName = giá trị;

Trong trường hợp này, propertyName không thể chỉnh sửa và không thể tính toán được.bạn không thể làm như sau:

object.('property'+'Name') 

như bạn có thể nhìn thấy

object = {propertyName:value}; 
    object = {'propertyName':value}; 

họ đều bình đẳng

  1. bạn có thể sử dụng một biến như tên sở hữu với "[]";

bạn có thể làm:

var a = "propertyName"; 
object[a] = value; 

và lần này bạn phải sử dụng một chuỗi

object[propertyName] = value;//error 
object["propertyName"] = value;//correct 
object = {'propertyName':value};//correct 
object = {propertyName:value};//correct 
29

Với ES6, bạn có thể xác định các phím năng động trong một đối tượng theo nghĩa đen:

const test = "test123" 
const test123 = { ["key" + test]: 123 }; 
Các vấn đề liên quan