2016-09-27 33 views
6

Biorąc pod uwagę następującą strukturę danych:Sortowanie i Grupa Immutable.js Lista

var MyData = [ 
    {"id": 1, "status": "live", dateCreated: "12:00:00 01/02/2016"}, 
    {"id": 2, "status": "draft", dateCreated: "13:00:00 03/12/2015"}, 
    {"id": 3, "status": "ready", dateCreated: "16:00:00 04/09/2016"}, 
    {"id": 4, "status": "ready", dateCreated: "10:00:00 01/10/2016"}, 
    {"id": 5, "status": "live", dateCreated: "09:00:00 05/07/2015"}, 
    {"id": 6, "status": "draft", dateCreated: "08:00:00 11/03/2016"}, 
    {"id": 7, "status": "ready", dateCreated: "20:00:00 12/02/2016"} 
] 

Próbuję uporządkować i grupa go w tych warunkach:

  1. pogrupowane według statusu
  2. Zamówione według statusu takiego, że zamówienie jest "na żywo", "wersja robocza", "gotowe".
  3. Przedmioty w ramach każdego statusu należy zamawiać według datyCreated, najnowsze jako pierwsze.

Co mam tak daleko:

// this object will help us define our custom order as it's not alphabetical 
const itemOrder = { 
    'live': 1, 
    'ready': 2, 
    'draft': 3 
}; 

const sortByStatus = (statusA, statusB) => { 
    if (itemOrder[statusA] > itemOrder[statusB]) return 1; 
    if (itemOrder[statusA] < itemOrder[statusB]) return -1; 
    return 0; 
}; 

return List(MyData) 
    .groupBy(item => item.status) 
    .sort(sortByStatus) 

ignorowanie przez chwilę fakt, że ja nie mam do punktu, gdzie można sortować według daty jeszcze :)

Problem z powyższe wydaje się, że sortByStatus jest przekazywany IndexedIterable, który jest ogólną grupą, ale nie jest kluczem, więc nie mogę go posortować według tego klucza. I think Prawdopodobnie potrzebuję użyć sortBy, ale dokumenty Immutable.js są niezrozumiałe i nie mają przykładów, na których można by się dowiedzieć, jak to osiągnąć.

Pytanie, w jaki sposób mogę uzyskać wynik działania groupBy i posortować go na zamówienie niestandardowe oraz dodatkowo, w jaki sposób mogę zagwarantować, że wszystkie pozycje w każdej grupie są posortowane według daty?

+0

uzyskać pomoc sortując datami zobaczyć tę odpowiedź: https://stackoverflow.com/questions/46936825/how-can-i-sort-an-immutablejs-list-object-on-multiple-keys – KerSplosh

Odpowiedz

1

Prostym rozwiązaniem jest po prostu dotrzeć do pierwszego elementu tablicy i uzyskać status stamtąd:

var MyData = [ 
 
    {"id": 1, "status": "live", dateCreated: "12:00:00 01/02/2016"}, 
 
    {"id": 2, "status": "draft", dateCreated: "13:00:00 03/12/2015"}, 
 
    {"id": 3, "status": "ready", dateCreated: "16:00:00 04/09/2016"}, 
 
    {"id": 4, "status": "ready", dateCreated: "10:00:00 01/10/2016"}, 
 
    {"id": 5, "status": "live", dateCreated: "09:00:00 05/07/2015"}, 
 
    {"id": 6, "status": "draft", dateCreated: "08:00:00 11/03/2016"}, 
 
    {"id": 7, "status": "ready", dateCreated: "20:00:00 12/02/2016"} 
 
] 
 

 
const itemOrder = { 
 
    'live': 1, 
 
    'ready': 2, 
 
    'draft': 3 
 
}; 
 

 
const sortByStatus = (statusA, statusB) => { 
 
var a = itemOrder[statusA.get(0).status]; 
 
var b = itemOrder[statusB.get(0).status]; 
 
console.log(statusA.get(0).status, a, statusB.get(0).status, b) 
 
    if (a > b) return 1; 
 
    if (a < b) return -1; 
 
    return 0; 
 
}; 
 

 
var result = Immutable.List(MyData) 
 
    .groupBy(item => item.status) 
 
    .sort(sortByStatus); 
 
    
 
    console.log(result.toJS())
<script src="https://cdnjs.cloudflare.com/ajax/libs/immutable/3.8.1/immutable.js"></script>

0

myślę, że były prawie. Ważne jest, aby zwrócić uwagę, że .groupBy zwraca zestaw list, więc kiedy wywołujesz sortowanie, potrzebujesz komparatora, który porównuje dwie różne listy zamiast dwóch. Możesz to łatwo zrobić, porównując status pierwszego elementu na każdej liście. Następnie chcesz posortować każdą listę osobno według daty, więc użyjesz .map, aby zastosować zmianę do każdej listy na liście, a następnie .sortBy na tej liście, aby sortować według określonego klucza. Zakładając, że używasz wbudowanego typu Date, just sorting by that field should do what you want.

var MyData = [ 
    {"id": 1, "status": "live", dateCreated: "12:00:00 01/02/2016"}, 
    {"id": 2, "status": "draft", dateCreated: "13:00:00 03/12/2015"}, 
    {"id": 3, "status": "ready", dateCreated: "16:00:00 04/09/2016"}, 
    {"id": 4, "status": "ready", dateCreated: "10:00:00 01/10/2016"}, 
    {"id": 5, "status": "live", dateCreated: "09:00:00 05/07/2015"}, 
    {"id": 6, "status": "draft", dateCreated: "08:00:00 11/03/2016"}, 
    {"id": 7, "status": "ready", dateCreated: "20:00:00 12/02/2016"} 
] 


Immutable.fromJs(MyData) 
    // [{id: 1, ...}, ...] 
    .groupBy(item => item.status) // group items into lists by status 
    // [ 'live': [ { id: 1, ... }, { id:5, ... } ], 
    // 'draft': [ { id: 2, ... }, { id: 6, ...} ], 
    // 'ready': [ { id: 3, ... }, { id: 4, ... }, { id: 7, ... } ] ] 
    .sort((listA, listB) => // order these groups by status 
    itemOrder[listA.first().status] - itemOrder[listB.first().status]) 
    // [ 'live': [ { id: 1, ...}, ... ], 
    // 'ready': [ { id: 3, ...}, ... ], 
    // 'draft': [ { id: 2, ...}, ... ] ] 
    .map(list => list.sortBy(item => item.dateCreated)); // sort the elements in each group by date 
    // [ 'live': [ { id: 5, ... }, { id: 1, ... } ], 
    // 'ready': [ { id: 4, ... }, { id: 3, ... }, { id: 7, ... } ], 
    // 'draft': [ { id: 2, , ...}, { id: 6, ... } ] ]