使用filter和groupby映射json数组的值

时间:2018-10-10 20:24:52

标签: ecmascript-6 angular5 lodash

我的json如下所示。我正在尝试根据角色ID将目标对象分组,目标ID等于1083。

我的json:

[  {
    "id" :1,
    "role": {
      "id": "25",
    },
    "target": {
      "id": "1083",
    }
  },
    {
    "id" :2,
    "role": {
      "id": "25",
    },
    "target": {
      "id": "1083",
    }
  },
    {
    "id" :3,
    "role": {
      "id": "25",
    },
    "target": {
      "id": "1084",
    }
  },
  {
    "id" :4,
    "role": {
      "id": "3",
    },
    "target": {
      "id": "1083",
    }
  }
  ]

预期结果:

{
  "25" : [
  {
    "id": 1
    "role": {
      "id": "25",
    },
    "target": {
      "id": "1083",
    }
    },
       { "id": 2
    "role": {
      "id": "25",
    },
    "target": {
      "id": "1083",
    }
    }
  ],
  "3": [
    {
    "id" :4,
    "role": {
      "id": "3",
    },
    "target": {
      "id": "1083",
    }
  }]
}

因此,对于我的结果json,它按25和3进行分组。我的预期结果中不存在第三条记录,因为它的目标ID为1084

我尝试使用过滤器仅获得目标ID 1083,但是当我尝试使用grouby时,却出现了错误

data.filter(o => { 
          return o.target.id === "1083"
        }) 

1 个答案:

答案 0 :(得分:0)

通过filtergroupBy使用lodash:

var data = [{ "id": 1, "role": { "id": "25", }, "target": { "id": "1083", } }, { "id": 2, "role": { "id": "25", }, "target": { "id": "1083", } }, { "id": 3, "role": { "id": "25", }, "target": { "id": "1084", } }, { "id": 4, "role": { "id": "3", }, "target": { "id": "1083", } } ]

const groupIt = (targetId) => _.chain(data)
   .filter(x => x.target.id ===targetId)
   .groupBy('role.id')
   .value()

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

您可以先通过filter然后通过reduce来实现同样的目的:

var data = [{ "id": 1, "role": { "id": "25", }, "target": { "id": "1083", } }, { "id": 2, "role": { "id": "25", }, "target": { "id": "1083", } }, { "id": 3, "role": { "id": "25", }, "target": { "id": "1084", } }, { "id": 4, "role": { "id": "3", }, "target": { "id": "1083", } } ]

const groupIt = (targetId) => data.filter(x => x.target.id === targetId)
   .reduce((r, c) => (r[c.role.id] = [...r[c.role.id] || [], c], r), {})

console.log(groupIt('1083'))