2012-04-18 2 views
1

여기에서 문제를 풀어 보려고 여기에서 질문했습니다. 저는 Ruby 1.8.7과 RoR 1.2.6을 사용하고 있습니다. 이 컨트롤러는 JSON을 렌더링합니다.Ruby 1.8.7 JSON.parse를 사용하여 해시 순서 지정

{ 
    "form_id": "1", 
    "form_structure": { 
    "3": { 
     "answer_required": "undefined", 
     "title": "This is a radio group, right?", 
     "cssClass": "radio", 
     "values": { 
      "4": { 
       "value": "Yes", 
       "baseline": "undefined" 
      }, 
      "5": { 
       "value": "No", 
       "baseline": "undefined" 
      }, 
      "7": { 
       "value": "Maybe", 
       "baseline": "undefined" 
      }, 
      "20": { 
       "value": "Test", 
       "baseline": "undefined" 
      } 
     } 
    } 
    } 
} 

"값"아래의 옵션은 표의 ID로 정렬됩니다. JSON에서 완벽 해 보인다. 나는 "값"아래에 JSON.parse, 모든 것을 사용하면 구타의 모든를 얻을 수 있으며,이 반환

{ 
    "form_id"=>"1", 
    "form_structure"=>{ 
    "3"=>{ 
     "title"=>"This is a radio group, right?", 
     "cssClass"=>"radio", 
     "answer_required"=>"undefined", 
     "values"=>{ 
      "7"=>{ 
       "baseline"=>"undefined", 
       "value"=>"Maybe" 
      }, 
      "20"=>{ 
       "baseline"=>"undefined", 
       "value"=>"Test" 
      }, 
      "4"=>{ 
       "baseline"=>"undefined", 
       "value"=>"Yes" 
      }, 
      "5"=>{ 
       "baseline"=>"undefined", 
       "value"=>"No" 
      } 
     } 
    } 
    } 
} 

이 코드는 내가 만들고 있어요 formbuilder에 사용되며, 정말 좋지 않을까 사람이 만든 양식 요소가 올바른 순서로 표시되지 않는 경우 누구나 내가 출력하거나 바로 전에 주문을 유지하거나 순서를 변경할 수있는 방법에 대한 통찰력을 갖고 있습니까? 여기

+0

더 루비 버전 1.8.9가 없습니다 ... –

+2

'Hash' 1.8.7에서 순서가 지정되지 않았다면'{ "values"=> [[7, { "baseline"=> ...}], [20, ...'? 어쨌든 좋은 일이 될 것입니다. 해시를 주문하는 것은 까다로운 사업입니다. 정의에 의한 –

+2

해시는 순서가 없습니다. 그것을 처리하고 배열로 변경하십시오. –

답변

1

당신은 이동 :이 값 해시의 키의 정수 값을 기준으로 해시를 정렬하고 더 큰 해시 다시 정렬 된 해시를 넣어 것입니다

form["form_structure"]["3"]["values"] = 
form["form_structure"]["3"]["values"].sort { 
     |a,b| a[0].to_i <=> b[0].to_i 
} 

.

당신이 그것을 모두 유지해야하는 경우 여전히이 사용하는 해시 : 해시 순서를 얻을 1.9.x 루비 버전

val = {} 
val = form["form_structure"]["3"]["values"].sort { 
     |a,b| a[0].to_i <=> b[0].to_i } 
ind = [] 
val.each { |v| ind += [v[0]] } 
val = {} 
ind.each { |k| val[k] = form["form_structure"]["3"]["values"][k] } 
form["form_structure"]["3"]["values"] = val 
+0

Err, 실제로 이것은 'values'키의 해시를 정렬 된 배열로 변환합니다. Ruby 1.8에서는 해시 순서가 보장되지 않습니다. –

+0

해시 작업과 동일한 방식으로 배열에 액세스 할 수 없기 때문에 동작이 완전히 다릅니다. –

+0

이제 해시의 순서가 지정된 해시입니다. 그렇습니다. 이론상 당신은 질서에 의지 할 수는 없지만, 실생활에서 잠시 동안 할 수있는 것은 그가 정말로 필요로하는 모든 것입니다. –

-2

업그레이드

관련 문제