Как прочитать массив JavaScript и переформатировать его как объекты JSON? - PullRequest
0 голосов
/ 05 июля 2018

Я получаю следующие данные из 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, а МЕСЯЦ - 1-й. Это продолжается так же.

Обычно за один конкретный месяц мы получаем 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.

Ответы [ 6 ]

0 голосов
/ 05 июля 2018

здесь у вас есть рабочее решение, и его легко прочитать.

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)
0 голосов
/ 05 июля 2018
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];
}
0 голосов
/ 05 июля 2018

Сгруппируйте входные данные по месяцам с 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);
0 голосов
/ 05 июля 2018

Если 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))
0 голосов
/ 05 июля 2018

Вы можете взять дату в качестве ключа для хеш-таблицы и собрать все пары ключ-значение. Позже получим только значение для массива объектов.

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; }
0 голосов
/ 05 июля 2018

Вот как вы можете получить желаемый результат -

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