Создайте функцию агрегирования, чтобы сообщить о самых популярных в Google DataTable

#google-visualization

#google-визуализация

Вопрос:

У меня есть таблица данных Google, которая выглядит следующим образом:

var data = new google.visualization.DataTable();
data.addColumn('string', 'City');
data.addColumn('string', 'Model');
data.addColumn('number', 'Sold');
data.addRows([
["Melbourne","Ford",10],
["Perth","Ford",2],
["Melbourne","Ford",7],
["Melbourne","Holden",25],
["Perth","Holden",25],
["Melbourne","Holden",12],
["Melbourne","Ford",11]
]);

Что я хотел бы сделать, так это сгруппировать по городам и сообщить о модели с наибольшей совокупной стоимостью продажи для этого города.

Возвращаемый результат будет :

City Model
Melbourne Holden
Perth Ford

Из моего чтения API визуализации Google можно написать пользовательскую функцию агрегирования, но это выходит за рамки моего ограниченного опыта.

Любая помощь будет с благодарностью принята.

Ответ №1:

Для этого потребуется двойная группировка: в первый раз, чтобы получить общее количество проданных моделей по городу, а во второй раз, чтобы получить самую популярную модель.

 var g1 = google.visualization.data.group(data, [0, 1], [{
    type: 'number',
    label: 'Total Sold',
    column: 2,
    aggregation: google.visualization.data.sum
}]);
// create a view to merge columns 1 and 2 together for the grouping below
var view = new google.visualization.DataView(g1);
view.setColumns([0, {
    type: 'string',
    label: 'Model QTy Sold',
    calc: function (dt, row) {
        var o = {model: dt.getValue(row, 1), sold: dt.getValue(row, 2)};
        return JSON.stringify(o);
    }
}]);
var g2 = google.visualization.data.group(data, [0], [{
    type: 'string'
    label: 'Most Popular'
    aggregation: function (values) {
        var max = null, ret = null;
        for (var i = 0; i < values; i  ) {
            var o = JSON.parse(values[i]);
            if (max == null || o.sold > max) {
                max = o.sold;
                ret = o.model;
            }
        }
        return ret;
    }
}]);
 

g2 должна содержать модель с самыми высокими продажами, сгруппированную по городам. Если между двумя моделями есть связь, это вернет первую модель в values массиве (вероятно values , она будет упорядочена по названию модели, но это не гарантируется).

Ответ №2:

Изменения, которые я внес во вторую группировку asgallant, были:

 var g2 = google.visualization.data.group(view, [0], [{
type: 'string',
label: 'Most Popular',
column: 1,
aggregation: function (values) {
    var max = null, ret = null;
    for (var i = 0; i < values.length; i  ) {
        var o = JSON.parse(values[i]);
        if (max == null || o.sold > max) {
            max = o.sold;
            ret = o.model;
        }
    }
    return ret;
}
 

}]);