2010-11-01 28 views
45

Tôi có một đối tượng json đầy ip nhưđộng Add Variable cặp Tên Giá trị để JSON Object

var ips = {} 

Sau đó tôi thêm đối tượng ip để đối tượng này như vậy

ips[ipID] = {} 

sau đó tôi cần phải thêm cặp giá trị tên động/biến cho mỗi ip vì vậy tôi đang sử dụng mã như thế này

var name; var value; var temp = {}; 
tmp[name] = value 

Câu hỏi của tôi là, làm cách nào để thêm se giá trị tên cặp/tmp cho các đối tượng ipID của tôi để kết quả của tôi quay ra như

ipID = { name : value, anotherName : anotherValue } 
+2

Bạn cũng cần mã để tạo JSON cuối cùng phải không? – orangepips

+0

có thể trùng lặp của [Sử dụng biến cho khóa đối tượng Javascript] (http://stackoverflow.com/questions/2274242/using-a-variable-for-a-javascript-object-key) – Bergi

Trả lời

134

Đó không phải là JSON. Nó chỉ là các đối tượng Javascript, và không có gì để làm với JSON.

Bạn có thể sử dụng dấu ngoặc vuông để đặt thuộc tính động. Ví dụ:

var obj = {}; 
obj['name'] = value; 
obj['anotherName'] = anotherValue; 

này mang lại cho chính xác giống như tạo ra các đối tượng với một đối tượng theo nghĩa đen như thế này:

var obj = { name : value, anotherName : anotherValue }; 

Nếu bạn đã thêm đối tượng vào bộ sưu tập ips, bạn sử dụng một cặp dấu ngoặc để truy cập đối tượng trong bộ sưu tập và một cặp khác để truy cập vào tính thích hợp trong đối tượng:

ips[ipId] = {}; 
ips[ipId]['name'] = value; 
ips[ipId]['anotherName'] = anotherValue; 

Lưu ý sự giống nhau với mã ở trên, nhưng y bạn chỉ đang sử dụng ips[ipId] thay vì obj.

Bạn cũng có thể nhận được một tham chiếu đến đối tượng trở lại từ bộ sưu tập, và sử dụng để truy cập vào các đối tượng trong khi nó vẫn còn trong bộ sưu tập:

ips[ipId] = {}; 
var obj = ips[ipId]; 
obj['name'] = value; 
obj['anotherName'] = anotherValue; 

Bạn có thể sử dụng các biến chuỗi để xác định tên của các thuộc tính:

var name = 'name'; 
obj[name] = value; 
name = 'anotherName'; 
obj[name] = anotherValue; 

đó là giá trị của biến (chuỗi) để xác định tài sản, vì vậy khi bạn sử dụng obj[name] cho cả thuộc tính trong mã trên, đó là chuỗi trong biến tại thời điểm mà bạn truy cập vào nó mà xác định p roperty sẽ được truy cập.

+0

Điều này sẽ hoạt động tốt nhưng tên cũng là các biến. Vì vậy, khi tên thay đổi nó sẽ ghi đè cặp giá trị tên trước đó. – Mike

+0

@Mike: Bạn có thể sử dụng biến để chỉ định tên thuộc tính. Đó là giá trị của biến tại thời điểm truy cập đối tượng quyết định thuộc tính nào được truy cập, do đó việc thay đổi biến thành một chuỗi khác nhau giữa các truy cập không phải là vấn đề. Xem phần bổ sung của tôi ở trên. – Guffa

+0

Vâng, tôi đang sử dụng một chức năng .change để tạo ra điều này và vì lý do nào đó nó giữ ghi đè tên của tôi. Có anyway để tạm thời deference biến? – Mike

5

Tôi giả định mỗi mục nhập trong "ips" có thể có nhiều cặp giá trị tên - vì vậy nó được lồng nhau. Bạn có thể đạt được cấu trúc dữ liệu này như sau:

var ips = {} 

function addIpId(ipID, name, value) { 
    if (!ips[ipID]) ip[ipID] = {}; 
    var entries = ip[ipID]; 
    // you could add a check to ensure the name-value par's not already defined here 
    var entries[name] = value; 
} 
6

khi sử dụng đối tượng javascript, bạn cũng có thể chỉ cần sử dụng "ký hiệu dấu chấm" để thêm một mục, (which JSLint prefers)

var myArray = { name : "john" }; 
//will initiate a key-value array with one item "name" and the value "john" 
myArray.lastName = "smith"; 
//will add a key named lastName with the value "smith" 
//Object {name: "john", lastName: "smith"} 

Đây là một ảnh chụp màn hình từ thử nghiệm trong Chrome console

screenshot

+0

là 'myArray' thực sự là một mảng Nó dường như là một' Object' hoặc băm –

+0

vâng, myObject sẽ là một lựa chọn tốt hơn tên – Max

1

Từ những câu trả lời khác đã đề xuất, tôi tin rằng điều này có thể hữu ích:

var object = ips[ipId]; 
var name = "Joe"; 
var anothername = "Fred"; 
var value = "Thingy"; 
var anothervalue = "Fingy"; 
object[name] = value; 
object[anothername] = anothervalue; 

Tuy nhiên, đây không phải thử nghiệm, chỉ là một giả định dựa trên sự lặp lại liên tục:

object["string"] = value; 
//object = {string: value} 
2

trong Javascript.

var myObject = { "name" : "john" }; 
    // { "name" : "john" }; 
    myObject.gender = "male"; 
    // { "name" : "john", "gender":"male"}; 
+0

tôi nhận được một lỗi "myObject.push thì không.?. một chức năng "khi tôi thử điều đó. – danjuggler

9

Với ECMAScript 6 có cách tốt hơn.

Bạn có thể sử dụng computed property names trong định nghĩa thuộc tính đối tượng, ví dụ:

var name = 'John'; 
var value = '42'; 
var name2 = 'Sarah'; 
var value2 = '35'; 

var ipID = { [name] : value, [name2] : value2 } 

này tương đương với những điều sau đây với các biến cho tên thuộc tính, như mong muốn.

var ipID = { John: "42", Sarah: "35" } 
Các vấn đề liên quan