javascript - 当存在具有特定名称的键时,数组将对象推送到数组中

标签 javascript arrays node.js arraylist

我有一个如下所示的对象数组

[
{
    "medication": {
        "name": "Turbohaler",
        "time": [
            "2018-09-07"
        ]
    }
},
{
    "medication": {
        "name": "Turbohaler",
        "time": [
            "2018-09-08"
        ]
    }
},
{
    "medication": {
        "name": "Turbohaler",
        "time": [
            "2018-09-09"
        ]
    }
},
{
    "medication": {
        "name": "Turbohaler",
        "time": [
            "2018-09-10"
        ]
    }
},
{
    "medication": {
        "name": "Turbohaler",
        "time": [
            "2018-09-11"
        ]
    }
},
{
    "medication": {
        "name": "Turbohaler",
        "time": [
            "2018-09-07"
        ]
    }
},
{
    "medication": {
        "name": "Turbohaler",
        "time": [
            "2018-09-08"
        ]
    }
},
{
    "medication": {
        "name": "Turbohaler",
        "time": [
            "2018-09-09"
        ]
    }
},
{
    "medication": {
        "name": "Turbohaler",
        "time": [
            "2018-09-10"
        ]
    }
},
{
    "medication": {
        "name": "Turbohaler",
        "time": [
            "2018-09-11"
        ]
    }
},
{
    "medication": {
        "name": "Septron",
        "time": [
            "2018-09-07"
        ]
    }
},
{
    "medication": {
        "name": "Septron",
        "time": [
            "2018-09-08"
        ]
    }
},
{
    "medication": {
        "name": "Septron",
        "time": [
            "2018-09-09"
        ]
    }
},
{
    "medication": {
        "name": "Septron",
        "time": [
            "2018-09-10"
        ]
    }
},
{
    "medication": {
        "name": "Septron",
        "time": [
            "2018-09-11"
        ]
    }
}
]

lodash 或 underscore 提供了很好的功能来最小化代码,但这些库仍然没有帮助我解决上述问题

我想实现如下所示的目标

[
  {
    "medication": {
    "name": "Turbohaler",
    "time": [
    "2018-09-07",
    "2018-09-08",
    "2018-09-09",
    "2018-09-10",
    "2018-09-11"
  ]
 }
},
{
 "medication": {
 "name": "Septron",
 "time": [
    "2018-09-07",
    "2018-09-08",
    "2018-09-09",
    "2018-09-10",
    "2018-09-11"
  ]
}

} ]

在我们的例子中,上面的结果是通过将具有相同键名(药物)的对象数组分组,并将其所有值一起获取并将其合并到数组中的单个对象中而形成的。我尝试了不同的方法,但失败了,如果有人可以尝试一下以获得超出预期的输出,我们将不胜感激

提前致谢

最佳答案

这是针对您所面临问题的 O(n) 解决方案。此外,在数组上使用扩展语法,以便在time 数组有多个项目时能够正确处理。

var arr = [{
    "medication": {
      "name": "Turbohaler",
      "time": [
        "2018-09-07"
      ]
    }
  },
  {
    "medication": {
      "name": "Turbohaler",
      "time": [
        "2018-09-08"
      ]
    }
  },
  {
    "medication": {
      "name": "Turbohaler",
      "time": [
        "2018-09-09"
      ]
    }
  },
  {
    "medication": {
      "name": "Turbohaler",
      "time": [
        "2018-09-10"
      ]
    }
  },
  {
    "medication": {
      "name": "Turbohaler",
      "time": [
        "2018-09-11"
      ]
    }
  },
  {
    "medication": {
      "name": "Turbohaler",
      "time": [
        "2018-09-07"
      ]
    }
  },
  {
    "medication": {
      "name": "Turbohaler",
      "time": [
        "2018-09-08"
      ]
    }
  },
  {
    "medication": {
      "name": "Turbohaler",
      "time": [
        "2018-09-09"
      ]
    }
  },
  {
    "medication": {
      "name": "Turbohaler",
      "time": [
        "2018-09-10"
      ]
    }
  },
  {
    "medication": {
      "name": "Turbohaler",
      "time": [
        "2018-09-11"
      ]
    }
  },
  {
    "medication": {
      "name": "Septron",
      "time": [
        "2018-09-07"
      ]
    }
  },
  {
    "medication": {
      "name": "Septron",
      "time": [
        "2018-09-08"
      ]
    }
  },
  {
    "medication": {
      "name": "Septron",
      "time": [
        "2018-09-09"
      ]
    }
  },
  {
    "medication": {
      "name": "Septron",
      "time": [
        "2018-09-10"
      ]
    }
  },
  {
    "medication": {
      "name": "Septron",
      "time": [
        "2018-09-11"
      ]
    }
  }
];
var tempObj = {};
arr.forEach((item)=>{
  if(!tempObj[item.medication.name]){
    tempObj[item.medication.name] = item;
  } else {
    tempObj[item.medication.name].medication.time.push(...item.medication.time);
  }
});
var res = Object.values(tempObj);
console.log(res);

关于javascript - 当存在具有特定名称的键时,数组将对象推送到数组中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52270768/

相关文章:

javascript - 如何显示加载程序直到显示图像?

javascript - 购物车实现Javascript。类型错误 : Cannot set property 'id' of undefined

python - 如何将 numpy ND 数组转换为 CFFI C++ 数组并再次转换回来?

javascript - 如何用nodejs解码html页面?

javascript - 使用 jquery 动态添加 Canvas

javascript - 改变输入复选框的状态 AngularJS

javascript - REACT NATIVE REDUX 如何在 Action 创建者收到的reducer中设置数组

node.js - 资源暂时不可用。 key 身份验证失败(错误 -18)。 (错误#35)

node.js - 为什么我的 socket.io 使用长轮询而不是 websocket?

JavaScript 正则表达式 : dynamic capture group