对象属性的通用分组

时间:2016-07-12 14:01:31

标签: ramda.js

我正在尝试按名称对这个对象进行分组,所以很好,我可以将所有名称'duval'与'lulu'区分开来:

const groupName = R.groupBy(R.prop('name'), [data]);

但这不会起作用:

let data = {
    benj: {
        content : undefined,
        name    : 'duval',
        complete: false,
        height  : 181
    },

    joy: {
        content : undefined,
        name    : 'duval',
        complete: true
    },


    kaori: {
        content : undefined,
        name    : 'lulu',
        complete: true
    },

    satomi: {
        content : undefined,
        name    : 'lulu',
        complete: true
    }
}

我应该更改对象的格式,还是有办法在这种对象中进行更改?

1 个答案:

答案 0 :(得分:2)

[data]传递给groupBy并没有多大帮助。您想要对包含单个项目的列表进行分组。该项目具有“bennj”和“joy”等属性而不是“name”这一事实只是问题的一部分。

如果这个输出很有用,你可以得到一些可行的东西:

{
  duval: {
    benj: {
      content: undefined,
      name: "duval",
      complete: false,
      height: 181
    },
    joy: {
      content: undefined,
      name: "duval",
      complete: true
    }
  },
  lulu: {
    kaori: {
      content: undefined,
      name: "lulu",
      complete: true
    },
    satomi: {
      content: undefined,
      name: "lulu",
      complete: true
    }
  }
}

但它涉及的更多:

compose(map(fromPairs), groupBy(path([1, 'name'])), toPairs)(data)

toPairs将数据转换为以下元素列表:

[
  "benj", 
  {
    complete: false, 
    content: undefined, 
    height: 181, 
    name: "duval"
  }
]

然后groupBy(path[1, 'name'])通过查找此列表中索引1处对象的名称来执行您要查找的分组。

最后map(fromPairs)会将这些列表列表转换回对象。

这不是一个特别优雅的解决方案,但是当你想对不是列表的东西进行列表处理时,它是相当典型的。