【问题标题】:Sort and Group an Immutable.js List对 Immutable.js 列表进行排序和分组
【发布时间】:2016-09-27 09:43:36
【问题描述】:

给定以下数据结构:

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

我正在尝试将其分类并分组为以下条件:

  1. 按状态分组
  2. 按状态排序,以便订单为“live”、“draft”、“ready”
  3. 每个状态中的项目应按创建日期排序,最近的在前。

到目前为止我所拥有的:

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

暂时忽略我还没有到可以按日期排序的地步:)

上面的问题似乎是 sortByStatus 正在传递 IndexedIterable ,它是整个组,但不是关键,所以我无法按该键对其进行排序。我认为我可能需要使用 sortBy,但 Immutable.js 文档难以理解,并且没有示例说明如何实现这一点。

那么,问题是:如何获取 groupBy 操作的结果并将其排序为自定义顺序,另外如何确保每个组中的所有项目都按日期排序?

【问题讨论】:

标签: javascript immutable.js


【解决方案1】:

一个简单的解决方法是进入数组的第一项并从那里获取状态:

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())
&lt;script src="https://cdnjs.cloudflare.com/ajax/libs/immutable/3.8.1/immutable.js"&gt;&lt;/script&gt;

【讨论】:

    【解决方案2】:

    我想你快到了。需要注意的重要一点是.groupBy 正在返回一个列表集合,因此当您对其调用 sort 时,您需要一个比较器来比较两个不同的列表而不是两个项目。您只需比较每个列表中第一项的状态即可轻松完成此操作。之后,您希望按日期单独对每个列表进行排序,因此您使用 .map 将更改应用于列表中的每个列表,然后在该列表上使用 .sortBy 按特定键排序。假设您使用的是内置的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, ... } ] ]
    

    【讨论】:

      猜你喜欢
      • 2020-12-29
      • 2017-02-20
      • 1970-01-01
      • 2015-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多