多级组合ramda js

时间:2017-07-31 01:34:25

标签: javascript arrays json ramda.js

我一直在尝试在多个级别使用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'
      }]
    }]
  }]
}

1 个答案:

答案 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