2015-04-02 43 views
-1

我有如下對象的JSON對象:排序包含一個JSON對象對象

{ 
    "166": 
     { 
      "name":{"name":"name","val":"matt","order":""}, 
      "props":{"name":"props","val":"1","order":""} 
     }, 
    "147": 
     { 
      "name":{"name":"name","val":"chris","order":""}, 
      "props":{"name":"props","val":"4","order":""} 
     } 
} 

在JavaScript中,我會怎麼排序的道具內的VAL財產此對象的對象?

+4

這不是一個數組... – 2015-04-02 14:44:58

+0

你沒有一個數組。你想如何分類這個對象,購買它的屬性/鍵(166,147)?檢查[這個答案](http://stackoverflow.com/questions/5467129/sort-javascript-object-by-key)或[this](http://stackoverflow.com/questions/1359761/sorting-a-javascript -object按屬性名稱)。 – skobaljic 2015-04-02 14:45:08

+1

這是一個對象,而不是一個數組。你不會像那樣處理json。 json是一種傳輸編碼格式。你將它解碼爲本地結構(例如JS對象,PHP數組,等等),然後對其進行排序。然後你重新將已排序的結構重新編碼爲json。 – 2015-04-02 14:46:19

回答

1

這應該讓你接近你想要的。這並不漂亮,但應該指向正確的方向。

var json = 
{ 
    "166": 
    { 
     "name": 
     { 
      "name":"name", 
      "val":"matt", 
      "order":"" 
     }, 
     "props": 
     { 
      "name":"props", 
      "val":"1","order":"" 
     } 
    }, 
    "147": 
    { 
     "name": 
     { 
      "name":"name", 
      "val":"chris", 
      "order":"" 
     }, 
     "props": 
     { 
      "name":"props", 
      "val":"4", 
      "order":"" 
     } 
    } 
}; 

var arr = []; 
for (var jsonProperty in json) { 
    if (json.hasOwnProperty(jsonProperty)) { 
     var propVal = json[jsonProperty]['props']['val']; 
     arr.push({val: propVal, obj: json[jsonProperty]}); 
    } 
} 
var sortedArray = arr.sort(function(a,b){return a.val-b.val}); 
+0

這已經按照我的意願工作了。非常感謝您的幫助。 – 2015-04-02 15:11:24

1

正如很多評論中提到的那樣,您不要「排序」一個對象。排序意味着順序,意味着一個集合,意味着一個數據結構。

所以首先,你需要一個對象數組。所以通過迭代鍵將它們提取到數組中。然後使用Array.sort和自定義比較器。

var objectsToSort = { 
    "166": 
     { 
      "name":{"name":"name","val":"matt","order":""}, 
      "props":{"name":"props","val":"1","order":""} 
     }, 
    "147": 
     { 
      "name":{"name":"name","val":"chris","order":""}, 
      "props":{"name":"props","val":"4","order":""} 
     } 
} 

var objects = Object.keys(objectsToSort).map(function (key) { 
    return objectsToSort[key]; 
}); 

objects.sort(function (a, b) { 
    return a.val - b.val; 
}); 

我注意到val是一個數字的字符串表示形式。如果你想有一個數字排序,無論是將其更改爲純整數或更改上面的排序函數使用parseInt

objects.sort(function (a, b) { 
    return parseInt(a.val, 10) - parseInt(b.val, 10); 
}); 

我喜歡改變與函數的實際數據,因爲這解析將對每比較兩次運行,通常排序N * log(n)。所以它會運行2(N * log(n))。