2016-03-16 22 views
0

所以我有一個JSON數組,看起來像這樣:尋找一種方式在JavaScript中排序對象數組

[ 
    { 
    row: [ 
     { 
     boat: { 
      description: 'Books', 
      version: '2', 
      id: 6 
     }, 
     airplanes: [ 
      { 
      airplane: [ 
       { 
       description: 'DVD', 
       version: 2, 
       uid: 69, 
       wid: 65, 
       id: 84 
       } 
      ], 
      trains: { 
       train: [ 
       { 
        description: 'Pictures', 
        version: 2, 
        id: 149 
       } 
       ], 
       actions: [ 
       { 
        description: 'This is a really long sentence.', 
        version: 2, 
        tid: 69.01, 
        id: 452 
       }, 
       { 
        description: 'article 2', 
        version: 2, 
        tid: 69.02, 
        id: 453 
       }, 
       { 
        description: 'developer 1', 
        version: 2, 
        tid: 69.03, 
        id: 454 
       } 
       ] 
      } 
      }, 
      { 
      airplane: [ 
       { 
       description: 'Games', 
       version: 2, 
       uid: 65, 
       wid: 61, 
       id: 80 
       } 
      ], 
      trains: { 
       train: [ 
       { 
        description: 'another great descriptions.', 
        version: 2, 
        id: 145 
       } 
       ], 
       actions: [ 
       { 
        description: 'being indecisive is good.', 
        version: 2, 
        tid: 65.01, 
        id: 442 
       }, 
       { 
        description: 'couches are comfortable', 
        version: 2, 
        tid: 65.02, 
        id: 443 
       } 
       ] 
      } 
      } 
     ] 
     } 
    ] 
    } 
] 

我想按升序排列,但仍然通過「婦女參與發展」上面的輸出排序能夠保持整體秩序。例如,在上面的例子中,元素0中的wid是65,而數組的元素1的wid值是61.因此,元素1和元素0應該交換。有沒有內置的JavaScript方法來排序這樣的json?

我將有一個json數組輸出比所提供的示例大很多。

+3

僅供參考,你有什麼是對象的數組,而不是JSON。 [JSON](http://www.json.org/)是一種指定的數據格式。 –

+1

這種特定場景沒有內置方法。你將不得不自己寫邏輯。或者[lodash](https://lodash.com/)可能有一些方法可以幫助你。不知道,我不使用lodash。 –

+0

雖然沒有內置的方法,但您可以在JavaScript中創建自定義排序函數,並將其用於要在對象內排序的對象數組(可能是'飛機數組')。下面是一個自定義排序的例子:http://stackoverflow.com/questions/5002848/how-to-define-custom-sort-function-in-javascript – Anton

回答

3

兩個下劃線和LoDash有一種方法,將你在尋找什麼。在這個例子中,我假設你將你顯示的數據結構存儲在一個名爲data的變量中。

_.each(data, function(obj) { 
    _.each(obj.row, function(row) { 
     // note the reassignment, _.sortBy does not sort in-place 
     row.airplanes = _.sortBy(row.airplanes, function(airplane) { 
      return airplane.wid; // This will sort ascending. 
           // To sort descending, simply multiply by -1 
     }); 
    }); 
}); 

那麼這是幹什麼的?它將根數據結構中的每個數組元素並循環遍歷它(這是第一個_.each)。然後,在這些對象中的每個對象中,它循環遍歷每個row元素,並按每個元素中包含的wid元素排序row.airplanes

希望這可以幫助你。另外,您發佈的數據嚴格無效JSON。每個密鑰應該雙引號,即"row",而不僅僅是row,單引號對於分隔字符串是無效的,即"DVD"而不是'DVD'。此外,您的boat版本是一個字符串,而您的其他版本標識符是整數,因此嘗試將版本標識符保留爲整數是個不錯的主意。

+0

我嘗試了你在https://jsfiddle.net/z50rc770 /出於某種原因,它不排序返回的結果(請參閱控制檯輸出)。我做了一個console.log(row.airplanes);那不是我應該做的嗎?我認爲row.airplanes會返回正確的輸出?或者它會自動更新「數據」數組? – adbarads

+1

我想出了我的問題,我將lodash.js和underscore.js cdns添加到我的jsfiddle中。根據你的回答,我想我會需要兩個。在意識到它是一個或另一個之後。我刪除了underscore.js並將_.each更改爲_.forEach,現在它看起來像預期的那樣工作。感謝您指點我正確的方向。 – adbarads

+0

@adbarads編輯的答案,使更清晰,謝謝 – daniel0mullins

0

我推薦使用優秀的jq命令行JSON處理器。因爲它是用便攜式書寫的,所以速度非常快。易於理解documentation

cat <file.json> | jq . -S 
相關問題