2017-03-06 70 views
3

在ramda.js哪能组和字段排序列表,然后移动每个组的所有,但第一项到该项目的孩子吗?Ramda组再转换兄弟姐妹的孩子

如下面这里,我的名字分组,并按日期排序下降:

[{ 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}] 

进入

[{ 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}] 
} 
] 

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

回答

5

另一种方法:

const fn = pipe(
    groupBy(prop('name')), 
    values, 
    map(lift(assoc('children'))(tail, head)) 
); 

如果你想在这个排序,你可以values,后补充一点:

map(sort(descend(prop('date')))), 

如果这是晦涩:map(lift(assoc('children'))(tail, head))你可以用更换相当于:

map((group) => assoc('children', tail(group), head(group))) 

你可以看到这在行动Ramda REPL

+0

这太神奇了 –

3

您还没有归他们,只是名字命令他们。将它们组成阵列的阵列,使用R.groupWith

R.groupWith(R.eqProps("name")) 

将其应用于数据后,使用map创建从每个组中的对象。

2

这里你可以得到想要的结果

const groupByName = groupBy(obj => obj.name); 
const sortByDate = sortBy(obj => obj.date); 
const grouped = pipe(groupByName, map(sortByDate), values); 

reduce((acc, val) => { 
acc.push(merge(head(val), {children: tail(val)})); 
return acc; 
}, [], grouped(data)); 
单程

Ramda snippet

2

可能有更好的方法来做到这一点,但我认为这是一个开始:

function yourAnswer (data) { 
    const groupByName = groupBy((person) => person.name) 
    return (
    Object.values(groupByName(data)) 
    .map((g) => g.sort((a, b) => a.id - b.id)) // sort by ascending id 
    .map(function(g) { // for each group, sorted by id 
     const o = Object.assign(g[0]) // create an object from the minimal id 
     o['children'] = g.slice(1) // assign 'children' to be equal the other objects in the group 
     return o 
    }) 
)} 

let data = [{ 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}] 

console.log(yourAnswer(data)) 

在试用ramda repl