簡體   English   中英

使用lodash映射/變換對象的javascript數組

[英]Map/Transform javascript array of objects using lodash

我有一個看起來像這樣的對象數組:

[
     {
      "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" }] } ] 

我嘗試了各種解決方案,但沒有任何運氣。

_.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> 

你也可以做到這一點,而不通過ES6 lodash與Object.entriesreducemap

 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) 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM