2016-06-10 7 views
0

Ich habe einige Daten im followng strukturiert:Sortieren von Daten in einem Array von Feldwert === 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 
     } 
    ] 

] 

Ich mag die Arrays innerhalb von theArraystatus.started, neu zu ordnen, so dass alle Anordnungen mit status.started === 0 sind auf den Boden gedrückt. So würde theArray wie folgt aussehen:

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 
     } 
    ] 
] 

I bevorzugt möchte Underscore.js verwenden, wenn möglich. Es hat mich nie in der Vergangenheit enttäuscht!

+0

Dies ist kein Ereignis gültig JavaScript ... – meskobalazs

+0

@meskobalazs Ist es nicht? – gcampbell

+1

'[' or '{' ........... –

Antwort

1

Das wäre ein Anfang mit underscore.js: Nur um die Elemente mit status.started nach unten zu verschieben.

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

Da Sie gerade auf Wert === 0 oder nicht sortieren, können Sie die Standardwerte und vergleichen Sie sie zuweisen.

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

Versuchen Sie dies. Ihr Hash war nicht syntaktisch korrekt, also habe ich mir erlaubt, das zu beheben. Danach können Sie verwenden.

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

Dies ist der gesamte Code mit dem festen Eingang.

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

Sie können einen Standardwert von Infinity nehmen für nicht Artikel gestartet.

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

Nizza Frage, aber in diesem Fall Art ist nicht notwendig, weil wir nichts Sortierung werden. Es geht nur darum, das schwarze Schaf an das Ende der Linie zu bringen. Warum also nicht einfach aus dem, wo es ist, herausspleißen und am Ende drängen. Aber dann verschieben sich die Indizes und Ihre forEach Schleife wird lustig. Ok, deshalb haben wir eine nette reduceRight() für uns zu spielen. Sie löschen den aktuellen Indexpositionspunkt und schießen ihn bis zum Ende ... und trotzdem ist der nächste Punkt immer noch der gleiche nächste Punkt. Cool. Machen wir das.

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);

das ist es also. Nur in O (n) Zeit.

Verwandte Themen