我一直在尝试在多个级别使用group by,以便按标签,文件夹和报告键对对象进行分组。我能够在单一级别进行分组,但无法继续进行。
const data = [{
"_index": "search_index",
"_type": "search_type",
"_id": "Co5EFxnqeo9ruq",
"_score": 1,
"_source": {
"admin_tags": [],
"type": "human",
"folder": "Feature Samples",
"url_t": "url_tdata",
"users": [
128
],
"agent_id": 2,
"url": "url_data",
"favorited_by": [20],
"idx": 121,
"path": "Report Samples//Feature Samples",
"name": "Grouping and Sorting",
"description": ""
}
}];
const mapIndexed = R.addIndex(R.map);
const tg = mapIndexed((x, i) => ({
"name": x._source.admin_tags[0] == undefined ? "Unclasified" : x._source.admin_tags[0],
"idx": i,
"folder": [{
"name": x._source.folder,
"idx": x._source.folder,
"report": [{
"agent_id": x._source.agent_id,
"description": x._source.description,
"favorited_by": x._source.favorited_by[0],
"name": x._source.name,
"idx": x._source.idx,
"path": x._source.path,
"type": x._source.type,
"url": x._source.url,
"url_t": x._source.url_t,
}]
}]
}), data);
const byTag = R.groupBy(data => data.name)
const tagged = byTag(tg);
console.log(tagged)
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.24.1/ramda.min.js"></script>
这是我试图通过三个级别的分组和user_report_id的值来实现的输出,视图始终设置为零。
const output = {
"message": "",
"payload": [{
"name": "Unclasified",
"idx": 0,
"folders": [{
"idx": "Feature Samples",
"name": "Feature Samples",
"reports": [{
"agent_id": 2,
"description": "",
"idx": 121,
"is_fav": 20,
"name": "Grouping and Sorting",
"type": "human",
"url": "url_data",
"url_t": "url_tdata",
"user_report_id": 0,
"views": 0,
"report_id": '2sdfsd'
}]
}]
}]
}
答案 0 :(得分:3)
可能有更好/内置的解决方案,但您可以使用map
对对象的“内部列表”进行分组,如下所示:
const data = [
{ letter: "a", number: 1, bool: true },
{ letter: "a", number: 2, bool: true },
{ letter: "a", number: 2, bool: false },
{ letter: "b", number: 1, bool: true },
{ letter: "b", number: 1, bool: false },
{ letter: "b", number: 1, bool: false },
{ letter: "c", number: 1, bool: true },
{ letter: "c", number: 2, bool: true },
{ letter: "c", number: 2, bool: false },
{ letter: "c", number: 2, bool: true },
];
const groupByLetterNumberBool = pipe(
groupBy(prop("letter")),
map(groupBy(prop("number"))),
map(map(groupBy(prop("bool"))))
);
groupByLetterNumberBool(data);
工作示例here。