Я использую d3-array
rollup
для выполнения групповой операции подсчета, как при подготовке к созданию таблицы HTML.
У меня есть переменное количество ключей группировки, которые я передаю вот так:
var rollup_keys = new Map([
['count', v => v.length],
['codeversion', d => d.codeversion],
['mode', d => d.mode],
['status', d => d.status]])
var data_counts = d3.rollup(all_data, ...rollup_keys.values())
Это дает мне вложенные Карты, например, псевдопредставление,
Map(3) {"codeversion_1" =>
Map(1) {"mode_1" =>
Map(2) {"status_1" => count_1,
"status_2" => count_2},
"codeversion_2" =>
Map(1) {"mode_1" =>
Map(2) {"status_1" => count_1,
"status_2" => count_2}
[...truncated...]
}
Я использую циклы for Vue.js для рендеринга таблицы HTML, что означает, что ее проще всего иметьплоское представление вышеуказанной вложенной карты.Что-то вроде ::
[
["codeversion_1", "mode_1", "status_1", 1"],
["codeversion_1", "mode_1", "status_2", 49],
["codeversion_2", "mode_1", "status_1", 3],
["codeversion_2", "mode_1", "status_2", 7],
]
Чтобы преобразовать вложенные карты в вышеприведенный формат плоского списка, я использую этот рекурсивный подход:
flatten_data: function(flatten_me){
let rows = []
if ( flatten_me instanceof Map) {
for (let [key, value] of flatten_me.entries()) {
if (value instanceof Map) {
let _rows = this.flatten_data(value)
for (_row of _rows) {
rows.push([key].concat(_row))
}
} else {
rows.push([key, value])
}
}
}
return rows
}
Но есть ли что-то встроенное в d3-массивэто означало бы, что я не должен был бы сгладить это сам?Мне кажется, что я упускаю что-то очевидное, но поиски flatten array
не дают полной перестановки ключ-значение, которую я ищу.