Map / Transform массив объектов javascript с использованием lodash - PullRequest
0 голосов
/ 26 октября 2018

У меня есть массив объектов, который выглядит следующим образом:

[
     {
      "group": {
        "name": "Software Developers",
        "desc":"some desc"
      },
      "name": "devs 1", 
        "file": "f1.csv"
    },
    {
      "group": {
        "name": "Software Developers",
        "desc":"some desc"
      },
      "name": "devs 2", 
      "file": "f2.csv"
    },
    {
      "group": {
        "name": "Ceos",
        "desc":"some desc"
      },
      "name": "ceos 1", 
      "file": "f3.csv"
    },
    {
      "group": {
        "name": "Ceos",
        "desc":"some desc"
      },
      "name": "ceos 2", 
      "file": "f4.csv"
    }
]

Используя lodash, как преобразовать этот массив json, чтобы он был таким:

[
    {
      "group": {
        "name": "Software Developers",
    "desc":"some desc"
      },
    lists: [{ "name": "devs 1", "file": "f1.csv" }, { "name": "devs 2", "file": "f2.csv" }]
    },
    {
      "group": {
        "name": "Ceos",
    "desc":"some desc"
      },
    lists: [{ "name": "ceos 1", "file": "f3.csv" }, { "name": "ceos 2", "file": "f4.csv" }]
    }
]

Я пробовал разные решения, но безуспешно.

Ответы [ 2 ]

0 голосов
/ 26 октября 2018

Вы также можете достичь этого без lodash через ES6 с Object.entries, reduce & map:

const data = [{ "group": { "name": "Software Developers", "desc": "some desc" }, "name": "devs 1", "file": "f1.csv" }, { "group": { "name": "Software Developers", "desc": "some desc" }, "name": "devs 2", "file": "f2.csv" }, { "group": { "name": "Ceos", "desc": "some desc" }, "name": "ceos 1", "file": "f3.csv" }, { "group": { "name": "Ceos", "desc": "some desc" }, "name": "ceos 2", "file": "f4.csv" } ]

const result = Object.entries(data.reduce((r,c) => 
  (r[c.group.name] = [...r[c.group.name] || [], c], r), {}))
    .reduce((r,[k,v]) => (r.push({ group: v[0].group, lists: v.map(({name, file}) => 
      ({ name, file })) }), r), [])

console.log(result)
0 голосов
/ 26 октября 2018

_.groupBy() group.name, а затем _.map() до желаемой структуры:

const data = [{"group":{"name":"Software Developers","desc":"some desc"},"name":"devs 1","file":"f1.csv"},{"group":{"name":"Software Developers","desc":"some desc"},"name":"devs 2","file":"f2.csv"},{"group":{"name":"Ceos","desc":"some desc"},"name":"ceos 1","file":"f3.csv"},{"group":{"name":"Ceos","desc":"some desc"},"name":"ceos 2","file":"f4.csv"}];

const result = _.flow([
  (arr) => _.groupBy(arr, 'group.name'),
  (groups) => _.map(groups, (g) => ({
    ..._.head(g).group,
    lists: _.map(g, o => _.pick(o, ['name', 'file']))
  }))
])(data);

console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>
...