숫자를 '색인'(JSON)으로 사용


87

최근에 JSON을 파고 들기 시작했고 현재는 숫자를 "식별자"로 사용하려고하는데 너무 잘 작동하지 않습니다. foo:"bar"잘 작동하지만 0:"bar"그렇지 않습니다.

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

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

다음과 같은 방법으로 수행 할 수있는 방법이 있습니까? Game.status[0].0내 인생을 더 쉽게 만들어 줄 것 같은 것. 물론 주위에 다른 방법이 있지만이 방법이 선호됩니다.


3
그 이유는 JavaScript에서 다른 많은 언어와 마찬가지로 속성 / 변수의 이름은 숫자로 시작할 수없고 $, _, az 및 AZ로만 시작하기 때문입니다. Game.status[0]어레이 가 아닌 이유는 무엇 입니까? 그러면 구문은 Game.status[0][0].
nikc.org

답변:


127

JSON은 키 이름 만 문자열로 허용합니다. 이러한 문자열은 숫자 값으로 구성 될 수 있습니다.

그래도 JSON을 사용하고 있지 않습니다. JavaScript 개체 리터럴이 있습니다. 당신은 할 수 있습니다 키에 대한 식별자를 사용하지만, 식별자는 숫자로 시작할 수 없습니다. 그래도 문자열을 사용할 수 있습니다.

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

점 표기법으로 속성에 액세스하는 경우 식별자를 사용해야합니다. 대신 대괄호 표기법 사용 : Game.status[0][0].

그러나 그 데이터가 주어지면 배열이 더 의미가있는 것 같습니다.

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

이것은 아직도 당신이 할 수없는 것Game.status[0].0
JaredMcAteer

16
아니요,하지만 Game.status[0][0].
Amadan

4
@OriginalSyn ´Game.status [0] .0´을 사용하는 것은 불가능합니다. Javascript는 점 표기법을 사용하려는 경우 속성 이름이 문자 나 밑줄로 시작하는 것을 허용하기 때문입니다. 그 주위에는 방법이 없습니다.
zatatatata

1
제가 찾던 바로 그 대답에 감사드립니다. 솔직히, 왜 처음부터 시작할 배열을 생각하지 않았는지 모르겠습니다. 뇌 동결에 대해 비난하겠습니다.
Zar

@Quentin, You aren't using JSON though. You have a JavaScript object literal. 유일한 차이점은가요 var =또는 JSON JS와 객체 사이 리터 이상 차이가 있습니까? JS 객체는 기본적으로 JSON이 변수에 저장됩니까?
Andre Bulatov 2015 년

6

먼저 JSON이 아닙니다. JSON은 모든 키가 문자열이어야한다고 요구합니다.

둘째, 일반 배열은 원하는 작업을 수행합니다.

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

을 사용하면 작동합니다 Game.status[0][0]. 점 표기법 ( .0) 과 함께 숫자를 사용할 수 없습니다 .

또는 숫자를 인용 할 수 있습니다 (예 :) { "0": "val" }.... 배열 대신 일반 객체가 있지만 동일한 구문이 작동합니다.


5

아마도 어레이가 필요하십니까?

var Game = {

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

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

3

자바 스크립트 객체 속성의 이름은 밑줄 또는 편지 중 하나로 시작하지 않는 경우, 당신은 (같은 점 표기법을 사용하지 못할 Game.status[0].0), 당신은 해야 되는 다른 표기법을 사용합니다 Game.status[0][0].

한 가지 다른 참고 사항, 상태 배열 내부의 객체가되어야합니까? 배열과 같은 객체를 사용하는 경우 대신 실제 배열을 사용하지 않는 이유는 무엇입니까?


2

JSON은 키 유형을 문자열로 규제합니다. 목적은 객체의 멤버에 액세스하기 위해 점 표기법을 지원하는 것입니다.

예 : person = { "height": 170, "weight": 60, "age": 32}. person.height, person.weight 등으로 멤버에 액세스 할 수 있습니다. JSON이 값 키를 지원하는 경우 이는 person.0, person.1, person.2와 같습니다.


1
person.1, person.2 등의 문제가 무엇인지 모르겠습니다.
Anshul

0

는 어때

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

이 중 하나가 작동합니까?

추신 : 귀하의 질문에있는 것은 JSON이 아닌 Javascript 객체입니다. JSON은 자바 스크립트 객체의 '문자열'버전입니다.


"JSON은 자바 스크립트 객체의 '문자열'버전입니다." 그것은 사실이 아닙니다. JSON 개체는 JavaScript 개체의 하위 집합입니다. 그렇지 않으면 JSON 사양을 따르지 않기 때문에 JavaScript 개체 인 것이
맞습니다

JSON은 JavaScript 개체 리터럴 표기법 의 하위 집합이며 JSON 개체는 JSON으로 표현할 수있는 데이터 유형입니다.
Quentin

@OriginalSyn : 글쎄요. JSON은 "교환 가능한"형식이며 언어 독립적 인 문자열 형식으로 사용됩니다. 대부분의 언어는 JSON을 구문 분석 할 수 있으며 Javascript에서는 Javascript 객체로 바뀝니다. benalman.com/news/2010/03/theres-no-such-thing-as-a-json을 참조하십시오 .
Willem Mulder

1
@OriginalSyn이 : 자바 스크립트에서 객체 리터럴은 없다 결코 JSON이기 때문에, JSON 항상 문자열. 개체 리터럴은 문자열이 아닙니다. "JSON 객체"라는 용어는 의미가 없습니다. 어떤 것이 "JSON"(문자열)과 "객체"(비 문자열)가 될 수 없기 때문입니다.
nnnnnn

0

JSON은 "JavaScript Object Notation"입니다. JavaScript는 키가 문자열 또는 기호 여야한다고 지정합니다.

MDN Docs의 다음 인용문은 "키 / 값"이라는 용어를 자주들을 때 "키 / 속성"이라는 용어를 사용합니다.

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

JavaScript에서 객체는 속성 모음으로 볼 수 있습니다. 객체 리터럴 구문을 사용하면 제한된 속성 집합이 초기화됩니다. 그런 다음 속성을 추가하고 제거 할 수 있습니다. 속성 값은 다른 개체를 포함하여 모든 유형의 값이 될 수 있으므로 복잡한 데이터 구조를 구축 할 수 있습니다. 속성은 키 값을 사용하여 식별됩니다. 키 값은 문자열 또는 기호 값입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.