javascript - 按嵌套键对数组进行分组

标签 javascript arrays ecmascript-6 ramda.js

有谁知道 ES6 或 Ramda 的方法可以通过对象键对对象数组进行分组,然后根据分组创建新的对象数组?例如,我有一个对象数组如下:

[
  {
    "name": "ABCD123",
    "code": "GFDGF",
    "ptj": {
      "code": "123",
      "desc": "ABCD 123"
    }
  },
  {
    "name": "ANGGUN",
    "code": "DSFD54",
    "ptj": {
      "code": "111",
      "desc": "111 123"
    }
  },
  {
    "name": "GDFDGG",
    "code": "HJ2",
    "ptj": {
      "code": "111",
      "desc": "111 123"
    }
  },
  {
    "name": "POT",
    "code": "POT89",
    "ptj": {
      "code": "222",
      "desc": "222 123"
    }
  },
  {
    "name": "POTER UTAMA",
    "code": "POTER345",
    "ptj": {
      "code": "123",
      "desc": "ABCD 123"
    }
  },
  {
    "name": "ABCD123ABCD",
    "code": "LOLL23",
    "ptj": {
      "code": "123",
      "desc": "ABCD 123"
    }
  },
  {
    "name": "ANGGUN 2",
    "code": "DSFD54",
    "ptj": {
      "code": "111",
      "desc": "111 123"
    }
  },
  {
    "name": "GDFDGG",
    "code": "HJ2",
    "ptj": {
      "code": "111",
      "desc": "111 123"
    }
  },
  {
    "name": "POT",
    "code": "POT89",
    "ptj": {
      "code": "222",
      "desc": "222 123"
    }
  },
  {
    "name": "POTER UTAMA",
    "code": "POTER345",
    "ptj": {
      "code": "123",
      "desc": "ABCD 123"
    }
  }
]

我想要一个按 ptj.descptj.code 分组的新数组:

[
  {
    "PTJ": "ABCD 123",
    "data": [
      {
        "name": "ABCD123",
        "code": "GFDGF",
        "ptj": {
          "code": "123",
          "desc": "ABCD 123"
        }
      },
      {
        "name": "POTER UTAMA",
        "code": "POTER345",
        "ptj": {
          "code": "123",
          "desc": "ABCD 123"
        }
      },
      {
        "name": "ABCD123ABCD",
        "code": "LOLL23",
        "ptj": {
          "code": "123",
          "desc": "ABCD 123"
        }
      },
      {
        "name": "POTER UTAMA",
        "code": "POTER345",
        "ptj": {
          "code": "123",
          "desc": "ABCD 123"
        }
      }
    ]
  },
  {
    "PTJ": "111 123",
    "data": [
      {
        "name": "ANGGUN",
        "code": "DSFD54",
        "ptj": {
          "code": "111",
          "desc": "111 123"
        }
      },
      {
        "name": "GDFDGG",
        "code": "HJ2",
        "ptj": {
          "code": "111",
          "desc": "111 123"
        }
      },
      {
        "name": "ANGGUN 2",
        "code": "DSFD54",
        "ptj": {
          "code": "111",
          "desc": "111 123"
        }
      },
    ]
  },
  {
    "PTJ": "222 123",
    "data": [
      {
        "name": "POT",
        "code": "POT89",
        "ptj": {
          "code": "222",
          "desc": "222 123"
        }
      },
      {
        "name": "POT",
        "code": "POT89",
        "ptj": {
          "code": "222",
          "desc": "222 123"
        }
      },
    ]
  }
]

目前我只有这个

const stores = myArray.reduce((r, a) => {
    r[a.ptj.desc] = r[a.ptj.desc] || [];
    r[a.ptj.desc].push(a);
    return r;
}, {});

不幸的是,它转换为对象,我不能使用 array.map。我做错了什么?我欢迎使用 ES6 或 ramda 来纠正和改进它。提前致谢

最佳答案

如果您只想将具有相同 ptj.desc 值的对象分组,并且不介意结果值是一个具有键索引的对象,那么您可以只使用 R.groupBy 像这样:

const data = [
  {
    "name": "ABCD123",
    "code": "GFDGF",
    "ptj": {
      "code": "123",
      "desc": "ABCD 123"
    }
  },
  {
    "name": "ANGGUN",
    "code": "DSFD54",
    "ptj": {
      "code": "111",
      "desc": "111 123"
    }
  },
  {
    "name": "GDFDGG",
    "code": "HJ2",
    "ptj": {
      "code": "111",
      "desc": "111 123"
    }
  },
  {
    "name": "POT",
    "code": "POT89",
    "ptj": {
      "code": "222",
      "desc": "222 123"
    }
  },
  {
    "name": "POTER UTAMA",
    "code": "POTER345",
    "ptj": {
      "code": "123",
      "desc": "ABCD 123"
    }
  },
  {
    "name": "ABCD123ABCD",
    "code": "LOLL23",
    "ptj": {
      "code": "123",
      "desc": "ABCD 123"
    }
  },
  {
    "name": "ANGGUN 2",
    "code": "DSFD54",
    "ptj": {
      "code": "111",
      "desc": "111 123"
    }
  },
  {
    "name": "GDFDGG",
    "code": "HJ2",
    "ptj": {
      "code": "111",
      "desc": "111 123"
    }
  },
  {
    "name": "POT",
    "code": "POT89",
    "ptj": {
      "code": "222",
      "desc": "222 123"
    }
  },
  {
    "name": "POTER UTAMA",
    "code": "POTER345",
    "ptj": {
      "code": "123",
      "desc": "ABCD 123"
    }
  }
]

const fn = R.groupBy(R.path(['ptj','desc']))

console.log(fn(data))
<script src="//cdnjs.cloudflare.com/ajax/libs/ramda/0.25.0/ramda.min.js"></script>

如果您确实希望得到与问题示例相同的结构,那么您可以使用 R.mapR.zipObjR.toPairs 像这样:

const data = [
  {
    "name": "ABCD123",
    "code": "GFDGF",
    "ptj": {
      "code": "123",
      "desc": "ABCD 123"
    }
  },
  {
    "name": "ANGGUN",
    "code": "DSFD54",
    "ptj": {
      "code": "111",
      "desc": "111 123"
    }
  },
  {
    "name": "GDFDGG",
    "code": "HJ2",
    "ptj": {
      "code": "111",
      "desc": "111 123"
    }
  },
  {
    "name": "POT",
    "code": "POT89",
    "ptj": {
      "code": "222",
      "desc": "222 123"
    }
  },
  {
    "name": "POTER UTAMA",
    "code": "POTER345",
    "ptj": {
      "code": "123",
      "desc": "ABCD 123"
    }
  },
  {
    "name": "ABCD123ABCD",
    "code": "LOLL23",
    "ptj": {
      "code": "123",
      "desc": "ABCD 123"
    }
  },
  {
    "name": "ANGGUN 2",
    "code": "DSFD54",
    "ptj": {
      "code": "111",
      "desc": "111 123"
    }
  },
  {
    "name": "GDFDGG",
    "code": "HJ2",
    "ptj": {
      "code": "111",
      "desc": "111 123"
    }
  },
  {
    "name": "POT",
    "code": "POT89",
    "ptj": {
      "code": "222",
      "desc": "222 123"
    }
  },
  {
    "name": "POTER UTAMA",
    "code": "POTER345",
    "ptj": {
      "code": "123",
      "desc": "ABCD 123"
    }
  }
]

const fn = R.groupBy(R.path(['ptj','desc']))

const fn2 = R.compose(R.map(R.zipObj(['PTJ', 'data'])), R.toPairs, fn)

console.log(fn2(data))
<script src="//cdnjs.cloudflare.com/ajax/libs/ramda/0.25.0/ramda.min.js"></script>

关于javascript - 按嵌套键对数组进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47735212/

相关文章:

Javascript 正则表达式问题 : strip special symbols and URL's

javascript - jQuery AJAX 解析具有多个节点级别的 JSON

c - C 中一维数组的元素在特定索引后不显示

javascript - 对于循环调用 HTTPS 地理编码 api 并将结果输入坐标到 SQL 数据库,如何让 Node 的 HTTPS 模块工作?

javascript - 在 Javascript 中制作函数的真实副本

javascript - 为什么不建议将 $rootScope 与函数一起使用?

javascript - 在 Dojo 中,使用 this.own 更安全,还是 Attach-event 也安全?

python - 如何在 Python 中基于 2D 数组对 NumPy 3D 数组进行索引?

java - 将 HashMap 中的两组值放入两个数组中,快速而简单

javascript - ES6 类方法可写吗?