2016-09-27 29 views
6

: Bu koşullar içinesıralama ve Grup bir aşağıdaki veri yapısı göz önüne alındığında Immutable.js Liste

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

ben sıralamak çalışıyorum ve grup bunu: duruma göre gruplanmış

  1. Sıralı siparişin "canlı", "taslak", "hazır" olduğu şekilde duruma göre
  2. Her bir durumun içindeki öğeler, en yakın zamanda önce, en yakın tarihte sıralanır.

Ne var bugüne kadar:

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

Henüz tarihe göre sıralayabilirsiniz :)

sorun bir an ben noktaya yok ettik gerçeği için Ignore Yukarıdakiler, sortByStatus'un genel grup olan IndexedIterable komutunu geçiriyor gibi görünüyor, ancak bu anahtarla sıralayamıyorum. Ben düşünüyorum Muhtemelen sortBy kullanmam gerekir, ancak Immutable.js belgeleri anlaşılamaz ve bunun nasıl gerçekleştirileceğine dair hiçbir örnek bulunmuyor.

Öyleyse, soru: groupBy eyleminin sonucunu nasıl alabilirim ve bunu özel bir sıraya nasıl ayırabilirim ve ayrıca her gruptaki tüm öğelerin tarihe göre sıralanmasını nasıl sağlayabilirim?

+0

, bu cevaba bakınız: https://stackoverflow.com/questions/46936825/how-can-i-sort-an-immutablejs-list-object-on-multiple-keys – KerSplosh

cevap

1

Bir kolay düzeltme sadece oradan durumunu dizinin ilk öğeye ulaşmak ve elde etmektir:

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

ben neredeyse orada olduğunu düşünüyorum. Dikkat edilmesi gereken en önemli şey, .groupBy'un bir liste koleksiyonunu döndürmesidir. Bu nedenle, bu listeyi sıraladığınızda, iki öğe yerine iki farklı listeyi karşılaştıran bir karşılaştırıcıya ihtiyacınız vardır. Her listedeki ilk öğenin durumunu karşılaştırarak bunu kolayca yapabilirsiniz. Bundan sonra, her bir listeyi tarihe göre ayrı ayrı sıralamak istiyorsunuz, böylece listenizdeki her listeye bir değişiklik uygulamak için .map kullanın, daha sonra bu listede belirli bir tuşa göre sıralamak için .sortBy'u kullanın. Date türünde just sorting by that field should do what you want türünü kullandığınızı varsayarak.

tarihe göre yardım ayırma işlemi için
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, ... } ] ] 
İlgili konular