2017-06-07 2 views
1

Sobald ein bestimmtes Versprechen gelöst ist, möchte ich jedes der Elemente in der Antwort durchlaufen und sie in einer bestimmten Reihenfolge in ein Array schieben.Erstellen eines neuen Arrays in einer bestimmten Reihenfolge

  1. status-start
  2. status-in-progress
  3. status-completed

Wie kann ich tun, um dies zu tun? Hier ist mein Code so weit:

dashService.getBatches(refresh) 
.then(function (response) { 
    if (response.error) { 
    console.log("No data received"); 
    } else { 
    angular.forEach(response.items, function (item) { 
     if (item.status === 'start') { 
     currentBatches.push(job); 
     } 
    }); 
    } 
}); 
+1

Vielleicht ist es einfacher, nur um das Ergebnis zu sortieren Array? Oder haben Sie einen etwas komplexeren Anwendungsfall? –

+0

@StanislavKvitash Aber die Reihenfolge, die erwähnt wird, ist weder aufsteigend noch absteigend. Wie würden Sie sicherstellen, dass das Array in dieser benutzerdefinierten Reihenfolge sortiert ist? Kann ich die Elemente nicht in bestimmter Reihenfolge verschieben, so dass das Array selbst je nach Bedarf neu angeordnet wird. – StrugglingCoder

Antwort

2

wie diesen

var newA=dataList.filter(x=>x.status=='status-start').concat(dataList.filter(x=>x.status=='status-in-progress')).concat(dataList.filter(x=>x.status=='status-completed')) 
1

Sobald Sie Ihre Antwort erhalten, gehen Sie wie folgt vor:

dataList = response.items; 
    var currentBatches = []; 

    var statusStartItems = dataList.filter(function(item){ return item.status === 'status-start';}); 
    //Loop through status-start items and push into currentbatches array 
    statusStartItems.each(function(item){ 
     currentBatches.push(item); 
    } 

    var statusInItems = dataList.filter(function(item){ return item.status === 'status-in';}); 
    //Loop through status-in items and push into currentbatches array 
    statusInItems .each(function(item){ 
     currentBatches.push(item); 
    } 

..so auf

+0

Ich denke nicht, dass dies eine bessere Lösung ist –

+0

Dies ist nur eine Idee/Ansatz zu geben. –

0

I erstellt eine Karte der verfügbaren Optionen und ihrer entsprechenden Reihenfolge und sortiert dann Ihre Werte basierend auf dieser Karte. Nach der Sortierung wird das Array iteriert und in das Zielarray geschoben. Das oder Sie könnten sie einmal zusammenstellen, um ein neues Array zu erzeugen.

const orderMap = { 
    'status-start': 0, 
    'status-in-progress': 1, 
    'status-completed': 2 
}; 

newData.sort((a, b) => { 
    return orderMap[a] - orderMap[b]; 
}).forEach(d => { 
    originalData.push(d); 
}); 

Heres a fiddle

Offensichtlich müssen Sie Objektstrukturen usw. ändern, das ist nur ein Proof of Concept ist. Auch dies ist in ES6 geschrieben, also kein IE aber es kann leicht in ES5 geschrieben werden.


EDIT: Ich sehe deine Art status die Demo aktualisiert auf einer Unter Eigenschaft beruht, dass zu reflektieren.

https://jsfiddle.net/k0m2s1yt/2/

+0

Eine Karte? Eine '' map''? – Crowes

+0

@Crowes Ich nehme an, Sie beziehen sich auf die Tatsache, dass ich keine ES6 'map' verwende, sondern ein einfaches Objekt? Wenn nicht, bitte erläutern. – ste2425

0

Als Option können Sie auch 3 verschiedene Anordnungen aufweisen kann, die in Folge verkettet werden, könnte man:

var dataList = [ 
 
    {id: 11, status: 'status-start'}, 
 
    {id: 2, status: 'status-completed'}, 
 
    {id: 3, status: 'status-in-progress'}, 
 
    {id: 4, status: 'status-start'}, 
 
    {id: 5, status: 'status-completed'}, 
 
    {id: 6, status: 'status-in-progress'}, 
 
    {id: 7, status: 'status-start'}, 
 
    {id: 8, status: 'status-start'}, 
 
    {id: 9, status: 'status-in-progress'}, 
 
    {id: 10, status: 'status-start'}, 
 
    {id: 11, status: 'status-completed'}, 
 
    {id: 1, status: 'status-completed'} 
 
]; 
 

 
var currentBatches = [], 
 
currentStartedBatches = [], 
 
currentInProgressBatches = [{id: 200, status: 'status-in-progress'}], 
 
currentCompletedBatches = [{id: 12, status: 'status-completed'}, {id: 119, status: 'status-completed'}]; 
 

 
currentStartedBatches = currentStartedBatches.concat(dataList.filter(function(d){ return d.status ==='status-start' })); 
 

 
currentInProgressBatches = currentInProgressBatches.concat(dataList.filter(function(d){ return d.status ==='status-in-progress' })); 
 

 
currentCompletedBatches = currentCompletedBatches.concat(dataList.filter(function(d){ return d.status ==='status-completed' })); 
 

 
currentBatches = currentBatches.concat(currentStartedBatches).concat(currentInProgressBatches).concat(currentCompletedBatches); 
 

 
console.log(currentBatches);

Verwandte Themen