js关于数组中key值去重再重组

新手上路,请多包涵

例如 数据格式:

    var arr = [
      {categroyId: 1363, tagId: 5, id: 29},
      {categroyId: 1363, tagId: 5, id: 59},
      {categroyId: 1363, tagId: 15, id: 70},
      {categroyId: 1363, tagId: 16, id: 72},
      {categroyId: 817, tagId: 5, id: 29},
      {categroyId: 1966, tagId: 5, id: 29},
      {categroyId: 1966, tagId: 20, id: 77},
    ]
    想得到
    [
      [
        {
          categroyId: 1363,
          tagId:5,
          contents:[
            id:29,id:59
          ]
        },
        {
          categroyId: 1363,
          tagId: 15,
          contents:[
            id: 70
          ]
        },{
          categroyId: 1363,
          tagId:16,
          contents:[
            id: 72
          ]
        },
      ],
      [
        {
          categroyId: 817,
          tagId:5,
          contents:[
            id:29
          ]
        }
      ],
      [
        {
          categroyId: 1966,
          tagId:5,
          contents:[
            id:29
          ]
        },
        {
          categroyId: 1966,
          tagId: 20,
          contents:[
            id: 77
          ]
        },
      ]
    ]

先去重arr中重复的categroyId字段,然后再判断重复的tagId字段

阅读 2.2k
2 个回答

一下解,似乎有更好的答案

Object.values(arr.reduce((result, {categroyId, tagId, id}) => {
    (result[categroyId] || (result[categroyId] = {}))[tagId]
    ? result[categroyId][tagId].contents.push(id)
    : result[categroyId][tagId] = {
        categroyId,
        tagId,
        contents: [id]
    }
    return result
}, {})).map(it => Object.values(it))
var arr = [
      {categroyId: 1363, tagId: 5, id: 29},
      {categroyId: 1363, tagId: 5, id: 59},
      {categroyId: 1363, tagId: 15, id: 70},
      {categroyId: 1363, tagId: 16, id: 72},
      {categroyId: 817, tagId: 5, id: 29},
      {categroyId: 1966, tagId: 5, id: 29},
      {categroyId: 1966, tagId: 20, id: 77},
];
(m => Object.keys(m).map(k => Object.keys(m[k]).map(t => m[k][t])))(arr.reduce((m, n) => {
    const { categroyId, tagId, id } = n
    let item1 = m[categroyId] = m[categroyId] || {}
    let item2 = item1[tagId] = item1[tagId] || { categroyId, tagId, contents: [] }
    item2.contents.push(id)
    return m
}, {}))

图片描述

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题