2011-04-24 5 views
45

내가 원래 키로 ID로, 일반 자바 스크립트 객체에 저장된 일부 데이터를 가지고 : 그러나키 조회를 유지하면서 Javascript 개체/배열을 정렬하는 방법은 무엇입니까?

{ 
    "7": {"id":"7","name":"Hello"}, 
    "3": {"id":"3","name":"World"}, 
    ... 
} 

, 나는 브라우저에서, 그래서 그들을 통해 반복 특정 객체의 순서를 보장하지 않는 것을 발견 위의 "3"은 "7"앞에옵니다. I 올바른 순서를 반복 할 수 있지만 빠른 검색을 할 수 없어, 예를 들면, 지금

[ 
    {"id":"7","name":"Hello"}, 
    {"id":"3","name":"World"}, 
    ... 
] 

: I 이런 배열 포맷을 사용하여 전환 data["3"] 배열을 반복하지 않아도됩니다.

두 가지 방법을 결합하는 좋은 방법이 있습니까? 개체가 꽤 큽니다 (수백 개의 요소) 때문에 각 형식에 대해 별도의 개체를 사용하지 마십시오.

+5

가능한 중복 [? 빠른 검색을 위해 자바 스크립트 데이터 구조 및 정렬 루핑 (http://stackoverflow.com/questions/3549894/javascript-data-structure-for-fast-lookup-and-ordered-looping) –

+0

링크 된 답변보다 더 좋은 방법이 있는지 모르겠습니다. 그것은 각각에 대한 별도의 객체를 피하는 당신의 목표를 깬다 - 그러나 나는 더 좋은 방법을 알고 싶다! :) –

답변

61

나는이 문제를 가로 질렀다. 해결책은 원래 개체와 함께 정렬 된 키 배열을 유지하는 것입니다.

var second_object = objects[order[1]]; 

ECMA 표준은 객체의 요소의 순서에 대해 아무 말도하지 않습니다

var objects = { 
    "7": {"id":"7","name":"Hello"}, 
    "3": {"id":"3","name":"World"}, 
    ... 
} 
var order = [ "3", "7", ... ]; 

지금 당신은 당신이 조회를 할 수있는 두 번째 요소를 원하는 경우. 특히 은 숫자가 개일 때 Chrome에서 키를 재정렬합니다. 예 :이 같은 것을 얻을 것이다 크롬에서 인쇄하는 경우

var example = { 
    "a": "a", 
    "b": "b", 
    "1": "1", 
    "2": "2" 
}; 

:

{ 
    1: "1", 
    2: "2", 
    "a": "a", 
    "b": "b" 
}; 

을 조금 신 ..하지만 인생.

Andy 링크도 사용할 수 있습니다. 기본적으로이 두 개체를 하나의 개체로 묶습니다.

내가 많이 사용하는 대안으로는 개체를 순회하는 순서를 지정할 수있는 사용자 지정지도 함수가 있습니다. 일반적으로 사용자에게 데이터를 인쇄 할 때 정렬을 수행하므로 테이블 행을 반복하고 작성하는 동안 (예를 들어) 반복기가 정렬 함수가 지정하는 순서대로 행을 전달합니다. 나는 그것이 좋은 생각 :)

서명 보인다라고 생각 같은 :

function map(object, callback, sort_function); 

예 사용 :

map(object, function (row) { 
    table.add_row(row.header, row.value); 
}, function (key1, key2) { 
    return object[key1] - object[key2]; 
}); 
+0

좋은 아이디어, 고마워! 실제로 당신이 제안한 것과 반대의 작업을 수행하여 주 데이터 저장을 배열로 유지 (더 나은 루핑을 위해) 한 다음 배열 인덱스를 객체에 저장하고 즉석에서 생성합니다. – DisgruntledGoat

+0

(var i; i MJB

관련 문제