javascript - 如何读取 javascript 数组并将其重新格式化为 JSON 对象?
问题描述
根据我给定的参数,我正在从 Google Analytics API 获取以下数据。这是一个 JavaScript 数组对象。
[ [ '201801', '(Other)', '129' ],
[ '201801', 'Direct', '2236' ],
[ '201801', 'Email', '2' ],
[ '201801', 'Organic Search', '6263' ],
[ '201801', 'Referral', '185' ],
[ '201801', 'Social', '669' ],
[ '201802', '(Other)', '371' ],
[ '201802', 'Direct', '2037' ],
[ '201802', 'Email', '3' ],
[ '201802', 'Organic Search', '5790' ],
[ '201802', 'Referral', '162' ],
[ '201802', 'Social', '515' ],
[ '201803', '(Other)', '213' ],
[ '201803', 'Direct', '2465' ],
[ '201803', 'Organic Search', '8596' ],
[ '201803', 'Referral', '238' ],
[ '201803', 'Social', '356' ],
[ '201804', '(Other)', '65' ],
[ '201804', 'Direct', '1872' ],
[ '201804', 'Email', '1' ],
[ '201804', 'Organic Search', '9275' ],
[ '201804', 'Referral', '170' ],
[ '201804', 'Social', '307' ],
[ '201805', '(Other)', '35' ],
[ '201805', 'Direct', '2429' ],
[ '201805', 'Email', '2' ],
[ '201805', 'Organic Search', '8995' ],
[ '201805', 'Referral', '234' ],
[ '201805', 'Social', '341' ],
[ '201806', 'Direct', '51' ],
[ '201806', 'Organic Search', '282' ],
[ '201806', 'Referral', '1' ],
[ '201806', 'Social', '3' ] ]
如果根本不清楚,请检查此 GIST:https ://gist.github.com/chanakaDe/3ad4e2a51c99386a2737b65a82f034b1
在这个数组中,你可以看到像这样的 '201801'。这意味着 YEAR 是 2018 年,MONTH 是 1 日。它同样继续。
通常在某一特定月份,我们会得到 6 个值,例如 (Other) 、 Direct 、 Email 、 Organic Search 。推荐和社交。在这个数组中,同一日期重复 6 次。
我想做的是从中创建一个简单的 JSON 对象。这是我想要创建的格式,以便在我的 AngularJS 前端显示所有这些数据。
[
{
"date" : "201801",
"(Other)" : "129",
"Direct" : "2236",
"Email" : "2",
"OrganicSearch" : "6263",
"Referral" : "185",
"Social" : "669"
},
{
"date" : "201802",
"(Other)" : "371",
"Direct" : "2037",
"Email" : "3",
"OrganicSearch" : "5790",
"Referral" : "162",
"Social" : "515"
}
]
我想要一个这样的 JSON 数组。我试图找到重复的值,然后尝试将它们合并到一个 JSON 对象中(如果附近的元素相同)。很多这样的尝试。但是还是不行。请各位,此刻真的很想得到你们的帮助。我不擅长数据分析和这类排序。请帮帮我。这个项目是使用 Node.js 8.10.0 完成的。
解决方案
您可以将日期作为哈希表的键并收集所有键值对。稍后仅获取对象数组的值。
var array = [['201801', '(Other)', '129'], ['201801', 'Direct', '2236'], ['201801', 'Email', '2'], ['201801', 'Organic Search', '6263'], ['201801', 'Referral', '185'], ['201801', 'Social', '669'], ['201802', '(Other)', '371'], ['201802', 'Direct', '2037'], ['201802', 'Email', '3'], ['201802', 'Organic Search', '5790'], ['201802', 'Referral', '162'], ['201802', 'Social', '515'], ['201803', '(Other)', '213'], ['201803', 'Direct', '2465'], ['201803', 'Organic Search', '8596'], ['201803', 'Referral', '238'], ['201803', 'Social', '356'], ['201804', '(Other)', '65'], ['201804', 'Direct', '1872'], ['201804', 'Email', '1'], ['201804', 'Organic Search', '9275'], ['201804', 'Referral', '170'], ['201804', 'Social', '307'], ['201805', '(Other)', '35'], ['201805', 'Direct', '2429'], ['201805', 'Email', '2'], ['201805', 'Organic Search', '8995'], ['201805', 'Referral', '234'], ['201805', 'Social', '341'], ['201806', 'Direct', '51'], ['201806', 'Organic Search', '282'], ['201806', 'Referral', '1'], ['201806', 'Social', '3']],
result = Object.values(
array.reduce((r, [date, key, value]) => {
r[date] = r[date] || { date };
r[date][key] = value;
return r;
}, {})
);
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
推荐阅读
- javafx - 使用 OpenPDF、JavaFX 和 GraphicsContext 创建 PDF?
- python - tweepy.Cursor 将不相关的搜索结果返回到我选择的查询
- node.js - 使用 axios 请求时,仍然没有出现“Access-Control-Allow-Origin”标头
- neo4j - Neo4j 版本。4.1.1 密码语法错误“使用定期提交”
- mongodb - 有没有办法从 MongoDB 中的 ObjectId 生成条形码或二维码?
- python - Python - 标准库对将 dict 转换为 attributes-dict 的支持
- python - 如何比较Python中的列表列表?
- python - 如何将参数传递给类中的装饰器
- python - AttributeError:“PerReplica”对象没有属性“numpy”
- python - 我的电脑无法在 Python 3.8 上安装 pip