对象属性的通用分组

Generic Grouping of objects properties

我正在尝试按名称对这个对象进行分组,所以我可以很好地将所有名称 '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
    }
}

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

[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) 将把这些列表的列表变回对象。

这不是一个特别优雅的解决方案,但当您想对不是真正列表的内容进行列表处理时,它是相当典型的。