2016-06-10 113 views
0

我有一些數據在followng方式構造:排序數據0

theArray = [ 

    0:[ 
     0 : {}, 
     1 : {}, 
     2 : {}, 
     3 : {}, 
     status : { 
      started : 5, 
      finished : 7 
     } 
    ], 
    1:[ 
     0 : {}, 
     1 : {}, 
     2 : {}, 
     3 : {}, 
     status : { 
      started : 0, 
      finished : 3 
     } 
    ], 
    2:[ 
     0 : {}, 
     1 : {}, 
     2 : {}, 
     3 : {}, 
     status : { 
      started : 3, 
      finished : 1 
     } 
    ], 
    3:[ 
     0 : {}, 
     1 : {}, 
     2 : {}, 
     3 : {}, 
     status : { 
      started : 0, 
      finished : 7 
     } 
    ], 
    4:[ 
     0 : {}, 
     1 : {}, 
     2 : {}, 
     3 : {}, 
     status : { 
      started : 4, 
      finished : 0 
     } 
    ] 

] 

我想通過status.started重新排列內theArray陣列,使之與任何status.started === 0陣列是推到底部。所以theArray應該是這樣的:

theArray = [ 

    0:[ 
     0 : {}, 
     1 : {}, 
     2 : {}, 
     3 : {}, 
     status : { 
      started : 5, 
      finished : 7 
     } 
    ], 
    1:[ 
     0 : {}, 
     1 : {}, 
     2 : {}, 
     3 : {}, 
     status : { 
      started : 3, 
      finished : 1 
     } 
    ], 
    2:[ 
     0 : {}, 
     1 : {}, 
     2 : {}, 
     3 : {}, 
     status : { 
      started : 4, 
      finished : 0 
     } 
    ], 
    3:[ 
     0 : {}, 
     1 : {}, 
     2 : {}, 
     3 : {}, 
     status : { 
      started : 0, 
      finished : 3 
     } 
    ], 
    4:[ 
     0 : {}, 
     1 : {}, 
     2 : {}, 
     3 : {}, 
     status : { 
      started : 0, 
      finished : 7 
     } 
    ] 
] 

我想最好想如果可能使用Underscore.js。過去永遠不會讓我失望!

+0

這不是事件有效的JavaScript ... – meskobalazs

+0

@meskobalazs是不是? – gcampbell

+1

''''或'{'........... –

回答

1

這將以underscore.js開頭: 僅用於將status.started移動到底部的元素。

_.sortBy(theArray, function(element) { 
    return element.status.started === 0 ? 0 : 1; 
}); 
1

既然你只是要排序基於值=== 0或不,你可以指定默認值,並進行比較。

theArray.sort(function(a, b) { 
    var _v1 = a.status.started === 0 ? 1 : -1; 
    var _v2 = b.status.started === 0 ? 1 : -1; 
    return _v1 < _v2 ? -1 : _v1 > _v2 ? 1 : 0; 
}); 
0

試試這個。你的散列在語法上不是正確的,所以我冒昧解決這個問題。之後,你可以使用。

theArray.sort(function(a,b) { 
     return b.status.started - a.status.started; 
    }) 

這是具有固定輸入的整個代碼。

theArray = [ 

     { 
      0 : {}, 
      1 : {}, 
      2 : {}, 
      3 : {}, 
      status : { 
       started : 5, 
       finished : 7 
      } 
     }, 
     { 
      0 : {}, 
      1 : {}, 
      2 : {}, 
      3 : {}, 
      status : { 
       started : 0, 
       finished : 3 
      } 
     }, 
     { 
      0 : {}, 
      1 : {}, 
      2 : {}, 
      3 : {}, 
      status : { 
       started : 3, 
       finished : 1 
      } 
     }, 
     { 
      0 : {}, 
      1 : {}, 
      2 : {}, 
      3 : {}, 
      status : { 
       started : 0, 
       finished : 7 
      } 
     }, 
     { 
      0 : {}, 
      1 : {}, 
      2 : {}, 
      3 : {}, 
      status : { 
       started : 4, 
       finished : 0 
      } 
     }, 
    ] 

    theArray.sort(function(a,b) { 
     return b.status.started - a.status.started; 
    }) 
    console.log(theArray); 
0

對於未啓動的項目,您可以採用默認值Infinity

var theArray = [{ 0: {}, 1: {}, 2: {}, 3: {}, status: { started: 5, finished: 7 } }, { 0: {}, 1: {}, 2: {}, 3: {}, status: { started: 0, finished: 3 } }, { 0: {}, 1: {}, 2: {}, 3: {}, status: { started: 3, finished: 1 } }, { 0: {}, 1: {}, 2: {}, 3: {}, status: { started: 0, finished: 7 } }, { 0: {}, 1: {}, 2: {}, 3: {}, status: { started: 4, finished: 0 } }]; 
 

 
theArray.sort(function (a, b) { 
 
    return (a.status.started || Infinity) - (b.status.started || Infinity); 
 
}); 
 

 
console.log(theArray);

1

尼斯的問題,但在這種情況下,排序是沒有必要的,因爲我們沒有任何的排序。這只是把黑羊放到線路末端的事情。那麼爲什麼不把它從它所在的位置拼湊出來並推到最後。但隨後指數轉變,你的循環變得有趣。好吧,這就是爲什麼我們有一個不錯的reduceRight()供我們玩。您刪除當前的索引位置項目並將其拍攝到最後...但下一個項目仍然是下一個項目。涼。我們開始做吧。

var theArray = [{ 0: {}, 1: {}, 2: {}, 3: {}, status: { started: 5, finished: 7 } }, { 0: {}, 1: {}, 2: {}, 3: {}, status: { started: 0, finished: 3 } }, { 0: {}, 1: {}, 2: {}, 3: {}, status: { started: 3, finished: 1 } }, { 0: {}, 1: {}, 2: {}, 3: {}, status: { started: 0, finished: 7 } }, { 0: {}, 1: {}, 2: {}, 3: {}, status: { started: 4, finished: 0 } }]; 
 
theArray.reduceRight((p,c,i,a) => !c.status.started && a.push(a.splice(i,1)[0])); 
 
console.log(theArray);

所以這是它。僅在O(n)時間。