[javascript] JSON 목록의 요소 순서가 유지됩니까?

JSON 객체의 요소 순서가 원래 순서가 아닌 것을 알았습니다.

JSON 목록의 요소는 어떻습니까? 순서가 유지됩니까?



답변

예, JSON 배열의 요소 순서는 유지됩니다. 에서 RFC 7159 년 – 자바 스크립트 객체 표기법 (JSON) 데이터 교환 형식
(강조 광산) :

객체는 0 개 이상의 이름 / 값 쌍으로 정렬되지 않은 컬렉션입니다. 여기서 이름은 문자열이고 값은 문자열, 숫자, 부울, null, 객체 또는 배열입니다.

배열은 인 정렬 제로 이상의 값의 시퀀스.

“객체”와 “배열”이라는 용어는 JavaScript 규칙에서 비롯된 것입니다.

일부 구현은 JSON 객체의 순서도 유지하지만 이것이 보장되지는 않습니다.


답변

배열 ( []) 의 요소 순서 가 유지됩니다. “객체”( {}) 의 요소 순서 (이름 : 값 쌍)는 그렇지 않으며 JSON 포맷터 / 파서 자체가 아니라 언어 별 객체 (사전, 내부 표현으로 사용되는 NSDictionary, Hashtable 등).


답변

실제로, 키가 NaN 유형 인 경우 브라우저는 순서를 변경하지 않습니다.

다음 스크립트는 “One”, “Two”, “Three”를 출력합니다.

var foo={"3":"Three", "1":"One", "2":"Two"};
for(bar in foo) {
    alert(foo[bar]);
}

다음 스크립트는 “Three”, “One”, “Two”를 출력합니다.

var foo={"@3":"Three", "@1":"One", "@2":"Two"};
for(bar in foo) {
    alert(foo[bar]);
}


답변

일부 JavaScript 엔진은 키를 삽입 순서대로 유지합니다. 예를 들어, V8 은 부호없는 32 비트 정수로 구문 분석 할 수있는 키를 제외한 모든 키를 삽입 순서대로 유지합니다 .

즉, 다음 중 하나를 실행하면

var animals = {};
animals['dog'] = true;
animals['bear'] = true;
animals['monkey'] = true;
for (var animal in animals) {
  if (animals.hasOwnProperty(animal)) {
    $('<li>').text(animal).appendTo('#animals');
  }
}
var animals = JSON.parse('{ "dog": true, "bear": true, "monkey": true }');
for (var animal in animals) {
  $('<li>').text(animal).appendTo('#animals');
}

Chrome에서 V8을 사용하는 dog , bear , monkey 를 일관된 순서로 얻을 수 있습니다. Node.js는 V8도 사용합니다. 수천 개의 항목이 있어도 마찬가지입니다. 다른 JavaScript 엔진과 YMMV

여기여기에 데모가 있습니다 .


답변

“JSON 목록의 요소 순서가 유지됩니까?” 좋은 질문이 아닙니다. “[…]을 수행 할 때 JSON 목록의 요소 순서가 유지됩니까?” Felix King이 지적했듯이 JSON은 텍스트 데이터 형식입니다. 이유없이 변경되지 않습니다. JSON 문자열을 (JavaScript) 객체와 혼동하지 마십시오.

아마도 같은 작업에 대해 이야기하고 있습니다 JSON.stringify(JSON.parse(...)). 이제 답은 : 구현에 달려 있습니다. JSON 파서의 99 % *는 객체의 순서를 유지하지 않고 배열의 순서를 유지하지만 JSON을 사용하여 다음과 같은 것을 저장할 수 있습니다.

{
    "son": "David",
    "daughter": "Julia",
    "son": "Tom",
    "daughter": "Clara"
}

객체의 순서를 유지하는 파서를 사용하십시오.

* 아마도 훨씬 더 🙂


답변