Sử dụng số làm “chỉ mục” (JSON)


87

Gần đây đã bắt đầu tìm hiểu về JSON và tôi hiện đang cố gắng sử dụng một số làm "mã định danh", điều này không hoạt động quá tốt. foo:"bar"hoạt động tốt, trong khi 0:"bar"không.

var Game = {
    status: [
                {
                    0:"val",
                    1:"val",
                    2:"val"
                },
                {
                    0:"val",
                    1:"val",
                    2:"val"
                }
           ]
}

alert(Game.status[0].0);

Có cách nào làm theo cách sau không? Cái gì đó nhưGame.status[0].0 sẽ làm cho cuộc sống của tôi dễ dàng hơn. Tất nhiên có những cách khác xung quanh nó, nhưng cách này được ưu tiên hơn.


3
Lý do cho điều này là trong JavaScript, cũng như nhiều ngôn ngữ khác, tên của thuộc tính / biến không thể bắt đầu bằng một số mà chỉ bằng $, _, az và AZ. Tại sao không phải Game.status[0]là một mảng? Sau đó, cú pháp của bạn sẽ là Game.status[0][0].
nikc.org

Câu trả lời:


126

JSON chỉ cho phép tên khóa là chuỗi. Các chuỗi đó có thể bao gồm các giá trị số.

Tuy nhiên, bạn không sử dụng JSON. Bạn có một đối tượng JavaScript theo nghĩa đen. Bạn có thể sử dụng số nhận dạng cho khóa, nhưng số nhận dạng không thể bắt đầu bằng số. Bạn vẫn có thể sử dụng chuỗi.

var Game={
    "status": [
        {
            "0": "val",
            "1": "val",
            "2": "val"
        },
        {
            "0": "val",
            "1": "val",
            "2": "val"
        }
    ]
}

Nếu bạn truy cập vào các thuộc tính có ký hiệu dấu chấm, thì bạn phải sử dụng số nhận dạng. Sử dụng ký hiệu khung vuông thay vì: Game.status[0][0].

Nhưng với dữ liệu đó, một mảng dường như có ý nghĩa hơn.

var Game={
    "status": [
        [
            "val",
            "val",
            "val"
        ],
        [
            "val",
            "val",
            "val"
        ]
    ]
}

Điều này sẽ vẫn không cho phép bạn làmGame.status[0].0
JaredMcAteer

16
Không, nhưng sẽ cho phép Game.status[0][0].
Amadan

4
@OriginalSyn không thể có ´Game.status [0] .0´ vì Javascript chỉ cho phép tên thuộc tính bắt đầu bằng chữ cái hoặc dấu gạch dưới nếu bạn muốn sử dụng ký hiệu dấu chấm. Không có cách nào xung quanh điều đó.
zatatatata

1
Cảm ơn rất nhiều vì câu trả lời, chính xác những gì tôi đang tìm kiếm. Thành thật mà nói, tôi không biết tại sao tôi không nghĩ ra một mảng nào đó để bắt đầu - Tôi sẽ đổ lỗi cho việc đóng băng não.
Zar

@Quentin, You aren't using JSON though. You have a JavaScript object literal. Sự khác biệt duy nhất là var =hay có nhiều sự khác biệt hơn giữa JSON và một đối tượng JS theo nghĩa đen? Một đối tượng JS về cơ bản là JSON được lưu trữ trong một biến?
Andre Bulatov

6

Trước hết, nó không phải là JSON: JSON bắt buộc tất cả các khóa phải là chuỗi.

Thứ hai, các mảng thông thường làm những gì bạn muốn:

var Game = {
  status: [
    [
      "val",
      "val",
      "val"
    ],
    [
      "val",
      "val",
      "val"
    ]
  }

sẽ hoạt động, nếu bạn sử dụng Game.status[0][0]. Bạn không thể sử dụng các số có ký hiệu dấu chấm (.0 ).

Ngoài ra, bạn có thể trích dẫn các con số (tức là { "0": "val" }...); bạn sẽ có các đối tượng đơn giản thay vì Mảng, nhưng cú pháp tương tự sẽ hoạt động.


5

Có lẽ bạn cần một mảng?

var Game = {

    status: [
        ["val", "val","val"],
        ["val", "val", "val"]
    ]
}

alert(Game.status[0][0]);

3

Khi tên của thuộc tính đối tượng Javascript không bắt đầu bằng dấu gạch dưới hoặc chữ cái, bạn không thể sử dụng ký hiệu dấu chấm (như Game.status[0].0) và bạn phải sử dụng ký hiệu thay thế Game.status[0][0].

Một lưu ý khác, bạn có thực sự cần nó là một đối tượng bên trong mảng trạng thái không? Nếu bạn đang sử dụng đối tượng như một mảng, tại sao không sử dụng một mảng thực để thay thế?


2

JSON quy định loại khóa là chuỗi. Mục đích là hỗ trợ ký hiệu dấu chấm để truy cập các thành viên của đối tượng.

Ví dụ: person = {"height": 170, "weight": 60, "age": 32}. Bạn có thể truy cập các thành viên theo person.height, person.weight, v.v. Nếu JSON hỗ trợ các khóa giá trị, thì nó sẽ giống như person.0, person.1, person.2.


1
Tôi không thấy có gì sai với person.1, person.2, v.v.?
Anshul

0

Thế còn

Game.status[0][0] or Game.status[0]["0"] ?

Một trong những cái này có hiệu quả không?

Tái bút: Những gì bạn có trong câu hỏi của mình là một Đối tượng Javascript, không phải JSON. JSON là phiên bản 'chuỗi' của Đối tượng Javascript.


"JSON là phiên bản 'chuỗi' của Đối tượng Javascript." Điều đó không đúng. Đối tượng JSON là một tập hợp con của Đối tượng JavaScript. Nếu không, bạn đang đúng đó là một đối tượng JavaScript vì nó không phù hợp với các JSON đặc tả
JaredMcAteer

JSON là một tập hợp con của ký hiệu theo nghĩa đen của đối tượng JavaScript và đối tượng JSON là một kiểu dữ liệu có thể được thể hiện bằng JSON.
Quentin

@OriginalSyn: Chà, không hẳn. JSON là định dạng "có thể hoán đổi cho nhau" và được sử dụng làm định dạng chuỗi độc lập với ngôn ngữ. Hầu hết các ngôn ngữ đều có thể phân tích cú pháp JSON và trong Javascript, nó sẽ chuyển thành một Đối tượng Javascript. Xem benalman.com/news/2010/03/theres-no-such-thing-as-a-json .
Willem Mulder

1
@OriginalSyn: Trong JavaScript, các ký tự đối tượng không bao giờ là JSON, vì JSON luôn là một chuỗi. Các ký tự đối tượng không phải là chuỗi. Thuật ngữ "đối tượng JSON" không có ý nghĩa, vì một cái gì đó không thể vừa là "JSON" - một chuỗi và "đối tượng" - một không phải là chuỗi.
nnnnnn

0

JSON là "Ký hiệu đối tượng JavaScript". JavaScript chỉ định các khóa của nó phải là chuỗi hoặc ký hiệu.

Đoạn trích dẫn sau đây từ MDN Docs sử dụng các thuật ngữ "khóa / thuộc tính" để chỉ những gì tôi thường nghe hơn gọi là "khóa / giá trị".

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Objects

Trong JavaScript, các đối tượng có thể được xem như một tập hợp các thuộc tính. Với cú pháp theo nghĩa đen của đối tượng, một tập hợp các thuộc tính giới hạn được khởi tạo; thì các thuộc tính có thể được thêm vào và loại bỏ. Giá trị thuộc tính có thể là giá trị thuộc bất kỳ kiểu nào, kể cả các đối tượng khác, cho phép xây dựng cấu trúc dữ liệu phức tạp. Thuộc tính được xác định bằng các giá trị khóa. Giá trị khóa là giá trị Chuỗi hoặc Giá trị ký hiệu.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.