首页 > 解决方案 > 具有属性功能的多级 groupby

问题描述

这类似于multi level groupby ramda js,但有一个转折给我带来了麻烦。除了两级分组之外,我还希望内部分组位于属性值的处理版本上。

考虑这样的数据:

const data = [ 
  { top: 'top1',
    name: 'junk-key-a-101' },
  { top: 'top1',
    name: 'junk-key-b-102' },
  { top: 'top2',
    name: 'junk-key-c-103' },
  { top: 'top2',
    name: 'junk-key-c-104' } ];

我可以拔出密钥,对其进行处理并使其独一无二,如下所示:

const getZoneFromName = n =>  join('-', slice(1, 3, split('-', n)));
uniq(map(getZoneFromName, pluck('name', data)));

这会给我一个很好的清单:

["key-a", "key-b", "key-c"]

我可以将列表分为两个级别:

const groupByTopThenZone = pipe(
  groupBy(prop("top")),
  map(groupBy(prop("name")))
);
groupByTopThenZone(data);

但我无法弄清楚如何将它们组合起来以获得以下输出:

{
    top1: {
        "key-a": [
            {
                name: "junk-key-a-101",
                top: "top1"
            }
        ],
        "key-b": [
            {
                name: "junk-key-b-102",
                top: "top1"
            }
        ]
    },
    top2: {
        "key-c": [
            {
                name: "junk-key-c-103",
                top: "top2"
            },
            {
                name: "junk-key-c-104",
                top: "top2"
            }
        ]
    }
}

我觉得有点傻,我不能得到这个。有任何想法吗?是一个可以玩它的地方。

标签: javascriptramda.js

解决方案


你非常亲近。只需将这些功能与compose/结合pipe就可以了。

(注意这里也是一个简化版本getZoneFromName。)

const {pipe, groupBy, map, prop, slice} = R

//const getZoneFromName = n =>  join('-', slice(1, 3, split('-', n)));
const getZoneFromName = slice(5, -4)

const groupByTopThenZone = pipe(
  groupBy(prop("top")),
  map(groupBy(pipe(prop("name"), getZoneFromName)))
)

const data = [{"name": "junk-key-a-101", "top": "top1"}, {"name": "junk-key-b-102", "top": "top1"}, {"name": "junk-key-c-103", "top": "top2"}, {"name": "junk-key-c-104", "top": "top2"}]

console.log(groupByTopThenZone(data))
<script src="//cdnjs.cloudflare.com/ajax/libs/ramda/0.26.1/ramda.js"></script>

当然,这个函数简化了这么多,内联它可能更容易:

const groupByTopThenZone = pipe(
  groupBy(prop("top")),
  map(groupBy(pipe(prop("name"), slice(5, -4)))
)

要记住的主要事情groupBy是不一定与prop. 我们可以对任何 String//生成函数的结果进行分组NumberSymbol


推荐阅读