多级 groupby ramda js

multi level groupby ramda js

我一直在尝试在多个级别使用分组依据,以便对象按标签、文件夹和报告键分组。我能够在单个级别进行分组,但无法继续进行。

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'
      }]
    }]
  }]
}

解决方案中可能有 better/built,但您可以使用 map 将对象的 "inner lists" 分组,如下所示:

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