繁体   English   中英

如何读取一个JavaScript数组并将其重新格式化为JSON对象?

[英]How to read a javascript array and reformat it as JSON objects?

我正在根据给定的参数从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为第一。 它同样继续。

通常在一个特定的月份,我们会得到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; } 

在这里,您有一个可行的解决方案,而且很容易阅读。

 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];
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM