Ramda小组随后将兄弟姐妹转变为儿童

JK.*_*JK. 3 javascript functional-programming ramda.js

在ramda.js中,如何按字段对列表进行分组和排序,然后将除了每个组的第一个项目之外的所有项目移动到该项目的子项中?

例如下面我按名称分组并按日期降序排序:

[{ id: 1, name: 'bob', date: '2007-03-05', count: 15},
 { id: 2, name: 'bob', date: '2007-03-04', count: 32},
 { id: 3, name: 'bob', date: '2007-03-01', count: 27},
 { id: 4, name: 'jack', date: '2007-03-04', count: 3},
 { id: 5, name: 'jack', date: '2007-02-22', count: 5}]
Run Code Online (Sandbox Code Playgroud)

[{ id: 1, name: 'bob', date: '2007-03-05', count: 15,
   children: [{ id: 2, name: 'bob', date: '2007-03-04', count: 32},
   { id: 3, name: 'bob', date: '2007-03-01', count: 27}]
 },
 { id: 4, name: 'jack', date: '2007-03-04', count: 3,
   children: [{ id: 5, name: 'jack', date: '2007-02-22', count: 5}]
 }
 ]
Run Code Online (Sandbox Code Playgroud)

我知道我可以用R.head抓住整个列表的顶部项目,然后用R.tail抓住其余部分,然后将其作为R.merge的孩子添加,但我不知道如何抓住顶部或列表中的组尾部.

Sco*_*yet 5

另一种方法:

const fn = pipe(
  groupBy(prop('name')),
  values,
  map(lift(assoc('children'))(tail, head))
);
Run Code Online (Sandbox Code Playgroud)

如果要在此中包含排序,可以在以下后添加values,:

  map(sort(descend(prop('date')))),
Run Code Online (Sandbox Code Playgroud)

如果这是模糊的:map(lift(assoc('children'))(tail, head))您可以用等效的替换它:

  map((group) => assoc('children', tail(group), head(group)))
Run Code Online (Sandbox Code Playgroud)

您可以在Ramda REPL上看到这一点.