d3 Группировка и суммирование - PullRequest
0 голосов
/ 21 мая 2018

У меня есть объект данных JSON, состоящий из зон, почтовых индексов и количества элементов для каждого почтового индекса.Я пытаюсь суммировать (сворачивать) суммирование количеств и подсчет количества записей по зонам.Я использую d3.js в настоящее время, но открыта для других библиотек, если они лучше подходят.

Пример исходной структуры данных:

var test = [  
   {  
      "Name":"One Name",
      "Zip":"75001",
      "Zone":"A",
      "qty":60
   },
   {  
      "Name":"Two Name",
      "Zip":"75003",
      "Zone":"A",
      "qty":40
   },
   {  
      "Name":"Three Name",
      "Zip":"75009",
      "Zone":"B",
      "qty":20
   }
]

И вот желаемый результатЯ пытаюсь достичь:

[  
   {  
      "Zone":"A",
      "qtySum":100,
      "cnt":2,
      "values":[  
         {  
            "Name":"One Name",
            "Zip":"75001",
            "Zone":"A",
            "qty":60
         },
         {  
            "Name":"Two Name",
            "Zip":"75003",
            "Zone":"A",
            "qty":40
         }
      ]
   },
   {  
      "Zone":"B",
      "qtySum":20,
      "cnt":1,
      "values":[  
         {  
            "Name":"Three Name",
            "Zip":"75009",
            "Zone":"B",
            "qty":20
         }
      ]
   }
]

Я могу выполнить группировку без сводных данных, выполнив:

d3.nest()
.key(function(d) { return d.Zone; })
.entries(test)

И я могу свести данные в сводный объект с помощью:

d3.nest()
.key(function(d) { return d.Zone; })
.rollup(function(v) { return {
        count: v.length,
        total: d3.sum(v, function(d) { return d.qty; }),
    }; 
})
.entries(test);

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

1 Ответ

0 голосов
/ 21 мая 2018

Вы были очень близки с rollup.Чтобы добавить исходные объекты, добавьте values: v к возвращенному объекту.Затем используйте map, чтобы изменить объект и вернуть его в требуемом формате.

var test = [  
   {  
      "Name":"One Name",
      "Zip":"75001",
      "Zone":"A",
      "qty":60
   },
   {  
      "Name":"Two Name",
      "Zip":"75003",
      "Zone":"A",
      "qty":40
   },
   {  
      "Name":"Three Name",
      "Zip":"75009",
      "Zone":"B",
      "qty":20
   }
];

var grouped = d3.nest()
  .key(function(d) { return d.Zone; })
  .rollup(function(v) { 
    return {
      cnt: v.length,
      qtySum: d3.sum(v, function(d) { return d.qty; }),
      values: v
    }; 
  })
  .entries(test)
  .map(function(d) {
    return {
      Zone: d.key,
      qtySum: d.value.qtySum,
      cnt: d.value.cnt,
      values: d.value.values
    };
  });

d3.select("#foo").text(JSON.stringify(grouped, null, 2));

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...