Как преобразовать массив объектов в объект ассоциативных массивов в Javascript - PullRequest
0 голосов
/ 01 ноября 2018

Я получаю следующую структуру из системы. Я пытаюсь согнуть его в форму, необходимую для конкретного графа, используя chartjs. Учитывая структуру данных JSON… массив объектов в объекте:

{
"chart": [
    {
        "date": "2018-10-29",
        "done": 3,
        "todo": 10

    },
    {
        "date": "2018-10-30",
        "done": 4,
        "todo": 7
    },
    {
        "date": "2018-10-31",
        "done": 5,
        "todo": 12
    }
]

}

Мне нужна желаемая структура данных JSON ... объект массивов (в одном массиве, в одном объекте)

{
"chart": [{
    "date": [
        "2018-10-29",
        "2018-10-29",
        "2018-10-31"
    ],
    "done": [
        3,
        4,
        5
    ],
    "todo": [
        10,
        7,
        12
    ]
}]

}

Я пытался использовать функцию .map, но, похоже, у меня нет правильного map-fu.

Ответы [ 3 ]

0 голосов
/ 01 ноября 2018

Вот очень явное решение. Там могут быть некоторые более приятные решения Javascript; конечно, вы можете делать несколько вызовов .map, но это делает его менее эффективным.

// Variables
var dates = [];
var doneValues = [];
var todoValues = [];

// Loop through the original data once, collect the data.
originalJSON.forEach(function(data) {
  dates.push(data["date"]);
  doneValues .push(data["done"]);
  todoValues .push(data["todo"]);
});

// Put it all together.
return {"chart": [{"date": dates, "done": doneValues , "todo": todoValues}]};

Измените его в соответствии с вашими потребностями.

0 голосов
/ 01 ноября 2018

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

var data = { chart: [{ date: "2018-10-29", done: 3, todo: 10 }, { date: "2018-10-30", done: 4, todo: 7 }, { date: "2018-10-31", done: 5, todo: 12 }] },
    result = { chart: data.chart.reduce((r, o) => {
            Object.entries(o).forEach(([k, v]) => (r[k] = r[k] || []).push(v));
            return r;
        }, {})
    };
    
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
0 голосов
/ 01 ноября 2018

Как насчет использования Reduce?

const output = input.reduce((acc, curr) => ({
  date: acc.date.concat(curr.date),
  done: acc.done.concat(curr.done),
  todo: acc.todo.concat(curr.todo),
}), { date: [], done: [], todo: [] });

const chartData = {
  chart: [output],
};

Ссылка для уменьшения здесь: https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/Array/reduce

...