javascript - 如何将对象数组中的某些属性合并到另一个数组中?

标签 javascript arrays

我从 API 收到一个 JSON 作为响应我想将该 JSON 转换为另一个 JSON 数组我得到的响应是

 0: {date: "dailylogs20190116", nettype: "GSM On-Net", total: 143423725}
 1: {date: "dailylogs20190116", nettype: "Off-Net", total: 212679126}
 2: {date: "dailylogs20190116", nettype: "Int'l", total: 4066210}
 3: {date: "dailylogs20190116", nettype: "Landline", total: 6462665}
 4: {date: "dailylogs20190116", nettype: "On-Net", total: 31375}
 5: {date: "dailylogs20190116", nettype: "Free", total: 0}
 6: {date: "dailylogs20190116", nettype: "Premium", total: 16020}
 7: {date: "dailylogs20190117", nettype: "Landline", total: 7845098}
 8: {date: "dailylogs20190117", nettype: "Off-Net", total: 201740308}
 9: {date: "dailylogs20190117", nettype: "GSM On-Net", total: 143701795}
10: {date: "dailylogs20190117", nettype: "Premium", total: 472590}
11: {date: "dailylogs20190117", nettype: "Int'l", total: 4628890}
12: {date: "dailylogs20190117", nettype: "On-Net", total: 24000}
13: {date: "dailylogs20190117", nettype: "Free", total: 0}
14: {date: "dailylogs20190115", nettype: "Off-Net", total: 207502381}
15: {date: "dailylogs20190115", nettype: "GSM On-Net", total: 150536440}
16: {date: "dailylogs20190115", nettype: "Int'l", total: 4859440}
17: {date: "dailylogs20190115", nettype: "Landline", total: 5838292}
18: {date: "dailylogs20190115", nettype: "On-Net", total: 34500}
19: {date: "dailylogs20190115", nettype: "Free", total: 0}

现在我想要一个这样格式的json

{
    dailylogs20190116: {
        nettype: ["GSM ON Net", "Offnet", "int'l", "Landline", "On-Net", "Free", "Premium"],
        total: [143423725, 212679126, 4066210, 6462665, 31375, 0]
    }
    //...and so on
}

我试过了

let final_json = {};
res.forEach(element => {
    for (i = 0; i < this.logs.length; i++) {
        if (element.date == this.logs[i]) {
            final_json[element.date] = {
                "net": element.nettype,
                "total": element.total
            }
        }
    }
})

我在使用此代码时遇到的问题是我只获得每个日期的最后记录,即对于 dailylogs20190116,我获得免费且总计 0

最佳答案

您可以使用简单的 reduce获得所需的输出:

const arr = [{date:"dailylogs20190116",nettype:"GSM On-Net",total:143423725},{date:"dailylogs20190116",nettype:"Off-Net",total:212679126},{date:"dailylogs20190116",nettype:"Int'l",total:4066210},{date:"dailylogs20190116",nettype:"Landline",total:6462665},{date:"dailylogs20190116",nettype:"On-Net",total:31375},{date:"dailylogs20190116",nettype:"Free",total:0},{date:"dailylogs20190116",nettype:"Premium",total:16020},{date:"dailylogs20190117",nettype:"Landline",total:7845098},{date:"dailylogs20190117",nettype:"Off-Net",total:201740308},{date:"dailylogs20190117",nettype:"GSM On-Net",total:143701795},{date:"dailylogs20190117",nettype:"Premium",total:472590},{date:"dailylogs20190117",nettype:"Int'l",total:4628890},{date:"dailylogs20190117",nettype:"On-Net",total:24000},{date:"dailylogs20190117",nettype:"Free",total:0},{date:"dailylogs20190115",nettype:"Off-Net",total:207502381},{date:"dailylogs20190115",nettype:"GSM On-Net",total:150536440},{date:"dailylogs20190115",nettype:"Int'l",total:4859440},{date:"dailylogs20190115",nettype:"Landline",total:5838292},{date:"dailylogs20190115",nettype:"On-Net",total:34500},{date:"dailylogs20190115",nettype:"Free",total:0}]

const output = arr.reduce((acc,{date, nettype,total }) => {
  acc[date] = acc[date] || {nettype: [], total:[]};
  acc[date].nettype.push(nettype);
  acc[date].total.push(total);
  return acc
}, {})

console.log(output)

关于javascript - 如何将对象数组中的某些属性合并到另一个数组中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54280020/

相关文章:

javascript - fullpage.js 问题定位导航按钮

javascript - 使 Firebug 控制台历史记录在浏览器退出时保留

javascript - 从字符串中仅提取大写字母 - javascript

javascript - JS如何获取多维数组的最大深度?

javascript - 这段 JavaScript 代码如何对这些数字进行排序?

javascript - 我如何检测客户端是否已从 Rails 打开/关闭 javascript?

javascript - 如何从后端服务文件返回新的promise对象到后端 Controller ?

php - 如何检查变量是否为数组?...或类似数组的东西

arrays - Symfony2 : Multi-level parameters in YML

java - 如何使用自定义对象创建 libgdx 数组的副本?