javascript - 将一组对象缩减为一个对象并将一些公共(public)信息分组到一个数组中

标签 javascript angular typescript ecmascript-6

我的意思是我有一个如下所示的对象数组,

connectionInfo: any = [
    {
      "deviceName": "transponder1",
      "ports": 4,
      "rowNo": 1,
      "columnNo": 1,
      "posX": 2060.5,
      "posY": 200,
      "portInfo": {
        "portNumber": "1",
        "x": "2260.5",
        "y": "261.6666666666667"
      }
    },
    {
      "deviceName": "transponder1",
      "ports": 4,
      "rowNo": 1,
      "columnNo": 1,
      "posX": 2060.5,
      "posY": 200,
      "portInfo": {
        "portNumber": "2",
        "x": "2260.5",
        "y": "395"
      }
    },
    {
      "deviceName": "transponder1",
      "ports": 4,
      "rowNo": 1,
      "columnNo": 1,
      "posX": 2060.5,
      "posY": 200,
      "portInfo": {
        "portNumber": "3",
        "x": "2260.5",
        "y": "528.3333333333334"
      }
    }
];

下面是我想要的输出方式,

{
  "deviceName": "transponder1",
  "ports": 4,
  "rowNo": 1,
  "columnNo": 1,
  "posX": 2060.5,
  "posY": 200,
  "portInfo": {
    "portNumber": "1",
    "x": "2260.5",
    "y": "261.6666666666667"
  },
  "allPortsInfo": [
    {
      "portNumber": "1",
      "x": "2260.5",
      "y": "261.6666666666667"
    },
    {
      "portNumber": "2",
      "x": "2260.5",
      "y": "395"
    },
    {
      "portNumber": "3",
      "x": "2260.5",
      "y": "528.3333333333334"
    },
    {
      "portNumber": "4",
      "x": "2260.5",
      "y": "528.3333333333334"
    }
  ]
}

我试过的在下面, const cInfo = this.connectionInfo.reduce((acc, value) => acc.concat(value.portInfo),[]);

使用上述方法我的输出是,

[
  {
    "portNumber": "1",
    "x": "2260.5",
    "y": "261.6666666666667"
  },
  {
    "portNumber": "2",
    "x": "2260.5",
    "y": "395"
  },
  {
    "portNumber": "3",
    "x": "2260.5",
    "y": "528.3333333333334"
  },
  {
    "portNumber": "4",
    "x": "2260.5",
    "y": "528.3333333333334"
  }
]

我已经使用 reduce 并将所有 portInfo 收集到一个包含所有 portInfo 的数组中 但我只是不知道我是否可以在 reduce 循环中做出预期的输出。

这是我的 code在 stackblitz 上

最佳答案

对于已经分组的数组,您可以将第一个元素作为对象并通过仅映射 portInfo 属性来添加新属性。

var data = [[{ deviceName: "transponder1", ports: 3, rowNo: 1, columnNo: 1, posX: 2060.5, posY: 200, portInfo: { portNumber: "1", x: "2260.5", y: "261.6666666666667" } }, { deviceName: "transponder1", ports: 3, rowNo: 1, columnNo: 1, posX: 2060.5, posY: 200, portInfo: { portNumber: "2", x: "2260.5", y: "395" } }, { deviceName: "transponder1", ports: 3, rowNo: 1, columnNo: 1, posX: 2060.5, posY: 200, portInfo: { portNumber: "3", x: "2260.5", y: "528.3333333333334" } }], [{ deviceName: "amplifier1", ports: 3, rowNo: 1, columnNo: 2, posX: 2860.5, posY: 200, portInfo: { portNumber: "1", x: "3060.5", y: "261.6666666666667" } }, { deviceName: "amplifier1", ports: 3, rowNo: 1, columnNo: 2, posX: 2860.5, posY: 200, portInfo: { portNumber: "2", x: "3060.5", y: "395" } }, { deviceName: "amplifier1", ports: 3, rowNo: 1, columnNo: 2, posX: 2860.5, posY: 200, portInfo: { portNumber: "3", x: "3060.5", y: "528.3333333333334" } }]],
    result = data.map(array => ({
        ...array[0],
        allPortsInfo: array.map(({ portInfo }) => portInfo)
    }));

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

关于javascript - 将一组对象缩减为一个对象并将一些公共(public)信息分组到一个数组中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58916004/

相关文章:

javascript - Angular 根据条件(任何内存泄漏?)使用异步将不同的可观察对象分配给模板

json - Angular 2 HTTP post方法不会将数据发送到request.JSON在Grails Action中

typescript - 为 TypeScript 中的重载捕获传递函数的泛型类型

javascript - 错误TS2339 : Property 'default' does not exist on type 'Special[]'

javascript - Ionic - 如何将 base64 图像上传到需要 MultipartFile 的 Spring Boot 端点?

angular - Angular Testing 中 tick() 和 flush() 有什么区别?

javascript - Next Js & Typescript - 类型示例中不存在属性 setState

javascript - 相对较好的向服务器发送数据的javascript安全机制

javascript - 在 css 仍然适用的情况下使用 javascript 添加和删除 div 样式

javascript - 正则表达式 : Retrieve the GUID inside [ ] parenthesis