2016-06-10 62 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)时间。