2012-05-27 32 views
7

Tôi có một đối tượng JSON được bắt đầu khi trang web được tải, như thế này:Thêm mục nào đó để phía trên cùng của một đối tượng JSON

data[foo] = bar; 
data[foo2] = bar2; 
data[foo3] = bar3; 

Có cách nào để tiêm một yếu tố trước phần tử đầu tiên foo, để khi thực hiện for var i in data, phần tử mới sẽ được lặp qua trước khi các phần tử được thêm khi đối tượng được khởi tạo?

Lý do là, tôi đang hiển thị một số mục cho người dùng. Khi người dùng bổ sung thêm một mục mới qua javascript, tôi muốn mục mới này sẽ được hiển thị trên tất cả các mặt hàng hiện có, tuy nhiên khi tôi thêm mục mới, tức là

data[newItem] = newItem; 

Sau đó, đối tượng JSON trông như thế này:

data[foo] = bar; 
data[foo2] = bar2; 
data[foo3] = bar3; 
data[newItem] = newItem; 

Thay vì làm thế nào tôi muốn, đó là:

data[newItem] = newItem; 
data[foo] = bar; 
data[foo2] = bar2; 
data[foo3] = bar3; 

Bất kỳ ý tưởng?

+0

[chủ đề này] (http: // stackoverflow.com/questions/280713/elements-order-in-a-for-in-loop) có lẽ là có liên quan. Cụ thể là phần có nội dung: Nếu đơn đặt hàng có liên quan, * hãy sử dụng một mảng. * –

Trả lời

13

Trong JS, thứ tự thuộc tính đối tượng không được đảm bảo. Do đó, ngay cả khi chúng được sắp xếp theo chuỗi JSON, khi được phân tích cú pháp như một đối tượng JS, bạn sẽ không bao giờ dự đoán thứ tự chúng xuất hiện.

Sử dụng mảng tốt hơn thay thế. Bạn có thể sử dụng phương thức unshift() để đặt mục trong chỉ mục đầu tiên.

var data = [bar,bar2,bar3]; 

data.unshift(newItem); 

//data = [newItem,bar,bar2,bar3]; 
+1

Xem thêm http://stackoverflow.com/questions/648139/is-the-order-of-fields-in-a-javascript-object- dự đoán-khi-looping-through-t và http://stackoverflow.com/questions/586182/javascript-insert-item-into-array-at-a-specific-index – georgebrock

+0

Không phải là một tùy chọn, tôi đã mã hóa nó như một đối tượng. Tôi sẽ phải thay đổi nó ở một nơi gazillion để sử dụng một mảng. Cách để làm cho nó hoạt động như một đối tượng? –

+0

vì vậy không có cách nào để sử dụng 'dữ liệu [" foo "]' để có được dữ liệu tương ứng .. Tôi tự hỏi nếu có thư viện mô phỏng OrderedDict của Python trong JavaScript – wong2

-3

Tôi nghĩ bạn có thể chuyển nó sang chuỗi, nối thêm dữ liệu của bạn vào đầu của chuỗi sau đó lại chuyển đổi chuỗi JSON sử dụng "eval"

+8

Cách xa bàn phím. – Incognito

+0

Tôi đã cố gắng giúp đỡ bằng cách cung cấp thông tin chi tiết –

+0

Vui lòng, đi nghiên cứu lý do bạn không nên sử dụng eval. Sau đó, tìm ra lý do tại sao bạn không nên chuyển đổi các đối tượng thành chuỗi và ngược lại ... – Incognito

3

Có cách nào để tiêm một phần tử trước phần tử foo đầu tiên?

nào đến trước trong mảng:

window.object hoặc window.alert?

Cả hai đối tượng đều không có thứ tự. Nếu bạn muốn một mảng sử dụng một mảng. Đối tượng không phải là mảng.

Nếu bạn muốn

var ThingsInOrder = [ 
    FirstThing, 
    SecondThing, 
    ThirdThing 
]; 
ThingsInOrder.push(ForthThing); 

Sử dụng một mảng.

Nếu bạn muốn:

var ThingsNeverInOrder = { 
    Window, 
    Alert, 
    Derp, 
    Herp 
}; 

ThingsNeverInOrder.foo = bar; 

Sử dụng một đối tượng.

8

Là một lời khen cho Joseph the Dreamer 's answer, tôi đã chạy một số kiểm tra nhanh trong firefox & chrome.

Firefox:

var obj = {}; 

obj.a = 'a'; 
obj.c = 'c'; 
obj.b = 'b'; 
obj['0'] = '0'; 

for(var i in obj){ 
    console.log(i); 
} 

//prints: 
a 
c 
b 
0 

Chrome:

var obj = {}; 

obj.a = 'a'; 
obj.c = 'c'; 
obj.b = 'b'; 
obj['0'] = '0'; 

for(var i in obj){ 
    console.log(i); 
} 

//prints: 
0 
a 
c 
b 
2

Tôi đã stumbled khi này và đạt được nó bằng cách sử:

const newObject = Object.assign({first: value}, oldObject)

Như đã đề cập, trật tự không được đảm bảo nhưng đối với tôi, điều này là đủ tốt. :)

+0

Làm việc hoàn hảo. – AnthonyVO

0

Thay vì thêm giá trị mới vào cùng một đối tượng, bạn có thể tạo đối tượng mới và sắp xếp thứ tự thuộc tính tùy thích. dụ:

var objj1 = {name:'viru',lastname:'nehra'}; 

Vì vậy, tạo một đối tượng mới với tài sản mới mà bạn muốn trên đầu trang:

var obj2 = {age: 21} 

và chạy:

for(var key in objj1){ 
    obj2[key] = objj1[key] 
} 

obj2 = {age: 21, name: "viru", lastname: "nehra"} 
Các vấn đề liên quan