如何读取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"。这意味着年份是2018年,月份是1st。它同样继续。

通常对于一个特定的月份,我们会得到 6 个值,例如 (其他( , 直接 , 电子邮件 , 自然搜索 .推荐和社交。在此数组中,同一日期重复 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; }

这里有一个可行的解决方案,并且易于阅读。

var example = [
['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']
]
//using a forEach to map to object and then a map to map it into an array.
var obj = {};
example.forEach(item => {
if (obj[item[0]]) {
obj[item[0]][item[1]] = item[2]
} else {
obj[item[0]] = {};
obj[item[0]]["date"] = item[0]
}
})
var result = Object.keys(obj).map(k => obj[k])
console.log(result)

以下是获得所需输出的方法 -

let data = [
['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']
];
let output = {};
data.map((value) => { if(!output[value[0]]) { output[value[0]] = {}; } output[value[0]][value[1]] = value[2]; })
console.log(Object.keys(output).map(key => { output[key]["date"] = key; return output[key]; }));

如果ary是你的输入数组,这应该这样做:

const outputObj = ary.reduce((obj, subAry) => {
const [date, key, val] = subAry 
obj[date] = obj[date] || {}
obj[date]['date'] = date
obj[date][key] = val
return obj
}, {})
console.log(Object.values(outputObj))

按月对输入数据进行分组,并将reduce键作为日期,并将分组对象映射到所需的输出:

const data = [ [ '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' ] ];
const dataObj = data.reduce((all, [month, key, val]) => {
if (!all.hasOwnProperty(month)) all[month] = {};
all[month][key] = val;
return all;
}, {});
const result = Object.keys(dataObj).map(k => Object.assign({}, dataObj[k], {date: k}))
console.log(result);
const input = [ 
[ '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' ]
];
let output = [];
for (let i = 0; i < input.length; i++) {
let index = output.findIndex(obj => obj.date === input[i][0]);
if (index === -1) {
index = output.length;
output[index] = {date: input[i][0]};
}
output[index][input[i][1]] = input[i][2];
}

最新更新