javascript - 具有属性功能的多级 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"
}
]
}
}
我觉得有点傻,我不能得到这个。有任何想法吗?这是一个可以玩它的地方。
解决方案
你非常亲近。只需将这些功能与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
//生成函数的结果进行分组Number
。Symbol
推荐阅读
- python - 在 Selenium Python 中更改浏览器窗口的标题
- python - 为什么在 django 中迁移 mysql 时出现类型错误?
- python - 如何在多列上实现隐马尔可夫模型?
- html - img src 不能与导航栏引导程序一起使用
- javascript - 在选择选项中动态隐藏所选值(性能问题)
- android - 使用 LinearLayout 向 ListView 添加标题,Listview 被推离屏幕(Xamarin Android)
- ios - 尝试在 WKWebview 中加载 url 但在 SFSafariViewController 或 iOS 中的外部 safari 中工作正常时出现会话过期错误
- ruby-on-rails - 使用属性 api 验证数值
- c++ - 关于模板的使用
- java - 如何查找哪个用户正在更新项目并在 sonarqube 上进行项目分析报告