2016-09-20 2 views
0

У меня есть json, как показано ниже, и я пытаюсь вложить данные перед визуализацией. Я хочу, чтобы под заголовком gov и non-gov, как каждый поставщик распределяется по высоким и низким проектам, поэтому пытается создать объект json, например, [{v1: {Gov: {high:3, low:2}, {Non-Gov: {high:12, low:1}}}, {v2:{Gov: {high:3, low:2}, {Non-Gov: {high:12, low:1}}}, ...]D3 вложенность и обход объекта

Я могу вложить данные, но не могу получить соответствующие значения. Любые рекомендации приветствуются. Извинения, если вопрос строится неопределенно.

[ 
    { 
    "vendor": "V1", 
    "ptype": "Gov", 
    "critical": "high" 
    }, 
    { 
    "vendor": "V2", 
    "ptype": "Gov", 
    "critical": "low" 
    }, 
    { 
    "vendor": "V3", 
    "ptype": "Gov", 
    "critical": "high" 
    }, 
    { 
    "vendor": "V4", 
    "ptype": "Non-Gov", 
    "critical": "low" 
    }, 
    { 
    "vendor": "V5", 
    "ptype": "Non-Gov", 
    "critical": "high" 
    }, 
    { 
    "vendor": "V6", 
    "ptype": "Gov", 
    "critical": "high" 
    }, 
    { 
    "vendor": "V7", 
    "ptype": "Gov", 
    "critical": "high" 
    }, 
    { 
    "vendor": "V8", 
    "ptype": "Non-Gov", 
    "critical": "low" 
    }, 
    { 
    "vendor": "V9", 
    "ptype": "Non-Gov", 
    "critical": "high" 
    }, 
    { 
    "vendor": "V10", 
    "ptype": "Gov", 
    "critical": "high" 
    }, 
    { 
    "vendor": "V1", 
    "ptype": "Non-Gov", 
    "critical": "low" 
    }, 
    { 
    "vendor": "V2", 
    "ptype": "Non-Gov", 
    "critical": "high" 
    }, 
    { 
    "vendor": "V3", 
    "ptype": "Non-Gov", 
    "critical": "low" 
    }, 
    { 
    "vendor": "V4", 
    "ptype": "Non-Gov", 
    "critical": "high" 
    }, 
    { 
    "vendor": "V5", 
    "ptype": "Non-Gov", 
    "critical": "high" 
    }, 
    { 
    "vendor": "V6", 
    "ptype": "Non-Gov", 
    "critical": "low" 
    }, 
    { 
    "vendor": "V7", 
    "ptype": "Gov", 
    "critical": "low" 
    }, 
    { 
    "vendor": "V8", 
    "ptype": "Gov", 
    "critical": "high" 
    }, 
    { 
    "vendor": "V9", 
    "ptype": "Non-Gov", 
    "critical": "high" 
    }, 
    { 
    "vendor": "V10", 
    "ptype": "Non-Gov", 
    "critical": "low" 
    }, 
    { 
    "vendor": "V1", 
    "ptype": "Gov", 
    "critical": "high" 
    }, 
    { 
    "vendor": "V2", 
    "ptype": "Gov", 
    "critical": "low" 
    }, 
    { 
    "vendor": "V3", 
    "ptype": "Non-Gov", 
    "critical": "high" 
    }, 
    { 
    "vendor": "V4", 
    "ptype": "Non-Gov", 
    "critical": "high" 
    }, 
    { 
    "vendor": "V5", 
    "ptype": "Non-Gov", 
    "critical": "high" 
    }, 
    { 
    "vendor": "V6", 
    "ptype": "Gov", 
    "critical": "high" 
    }, 
    { 
    "vendor": "V7", 
    "ptype": "Gov", 
    "critical": "high" 
    }, 
    { 
    "vendor": "V8", 
    "ptype": "Non-Gov", 
    "critical": "low" 
    }, 
    { 
    "vendor": "V9", 
    "ptype": "Gov", 
    "critical": "high" 
    }, 
    { 
    "vendor": "V10", 
    "ptype": "Gov", 
    "critical": "low" 
    } 
] 
  1. без накопительного пакета

    n = d3.nest().key(function(d){return d.vendor;}) 
        .key(function(d){return d.ptype;}) 
        .key(function(d){return d.critical;}) 
        .entries(j); 
    
  2. с накопительным пакетом

    n = d3.nest().key(function(d){return d.vendor;}) 
         .key(function(d){return d.ptype;}) 
         .key(function(d){return d.critical;}) 
         .rollup(function(leaf){ 
         return[ 
         {key:'GH', value:leaf[0].values.length} 
         ,{key:'GL',value:leaf[1].values.length} 
         ]}) 
         .entries(j); 
    

ответ

1

я мог бы сделать это таким образом ..

var nested_data = d3.nest() 
.key(function(d) { return d.vendor; }).sortKeys(d3.ascending) 
.key(function(d) { return d.ptype; }).sortKeys(function(d) { return d;}) 
.key(function(d) { return d.critical; }).sortKeys(function(d) { return d;}) 
.rollup(function(leaves) { return leaves.length; }) 
.entries(j); 

Спасибо!

1

Я не знаю D3, но с использованием ванильного JS вы можете преобразовать данные следующим образом :

var input = [ { "vendor": "V1", "ptype": "Gov", "critical": "high" }, { "vendor": "V2", "ptype": "Gov", "critical": "low" }, { "vendor": "V3", "ptype": "Gov", "critical": "high" }, { "vendor": "V4", "ptype": "Non-Gov", "critical": "low" }, { "vendor": "V5", "ptype": "Non-Gov", "critical": "high" }, { "vendor": "V6", "ptype": "Gov", "critical": "high" }, { "vendor": "V7", "ptype": "Gov", "critical": "high" }, { "vendor": "V8", "ptype": "Non-Gov", "critical": "low" }, { "vendor": "V9", "ptype": "Non-Gov", "critical": "high" }, { "vendor": "V10", "ptype": "Gov", "critical": "high" }, { "vendor": "V1", "ptype": "Non-Gov", "critical": "low" }, { "vendor": "V2", "ptype": "Non-Gov", "critical": "high" }, { "vendor": "V3", "ptype": "Non-Gov", "critical": "low" }, { "vendor": "V4", "ptype": "Non-Gov", "critical": "high" }, { "vendor": "V5", "ptype": "Non-Gov", "critical": "high" }, { "vendor": "V6", "ptype": "Non-Gov", "critical": "low" }, { "vendor": "V7", "ptype": "Gov", "critical": "low" }, { "vendor": "V8", "ptype": "Gov", "critical": "high" }, { "vendor": "V9", "ptype": "Non-Gov", "critical": "high" }, { "vendor": "V10", "ptype": "Non-Gov", "critical": "low" }, { "vendor": "V1", "ptype": "Gov", "critical": "high" }, { "vendor": "V2", "ptype": "Gov", "critical": "low" }, { "vendor": "V3", "ptype": "Non-Gov", "critical": "high" }, { "vendor": "V4", "ptype": "Non-Gov", "critical": "high" }, { "vendor": "V5", "ptype": "Non-Gov", "critical": "high" }, { "vendor": "V6", "ptype": "Gov", "critical": "high" }, { "vendor": "V7", "ptype": "Gov", "critical": "high" }, { "vendor": "V8", "ptype": "Non-Gov", "critical": "low" }, { "vendor": "V9", "ptype": "Gov", "critical": "high" }, { "vendor": "V10", "ptype": "Gov", "critical": "low" } ]; 
 

 
var working = input.reduce(function(p, c) { 
 
    var v = p[c.vendor]; 
 
    if (!v) v = p[c.vendor] = {Gov: {high: 0, low: 0}, "Non-Gov": {high: 0, low: 0}}; 
 
    v[c.ptype][c.critical]++; 
 
    return p; 
 
    }, {}); 
 

 
var output = Object.keys(working).map(function(v) { 
 
    var o = {}; 
 
    o[v] = working[v]; 
 
    return o; 
 
    }); 
 

 
console.log(output);

Или, если вы можете использовать синтаксис ES6 вы можете сделать .map() часть намного короче:

var input = [ { "vendor": "V1", "ptype": "Gov", "critical": "high" }, { "vendor": "V2", "ptype": "Gov", "critical": "low" }, { "vendor": "V3", "ptype": "Gov", "critical": "high" }, { "vendor": "V4", "ptype": "Non-Gov", "critical": "low" }, { "vendor": "V5", "ptype": "Non-Gov", "critical": "high" }, { "vendor": "V6", "ptype": "Gov", "critical": "high" }, { "vendor": "V7", "ptype": "Gov", "critical": "high" }, { "vendor": "V8", "ptype": "Non-Gov", "critical": "low" }, { "vendor": "V9", "ptype": "Non-Gov", "critical": "high" }, { "vendor": "V10", "ptype": "Gov", "critical": "high" }, { "vendor": "V1", "ptype": "Non-Gov", "critical": "low" }, { "vendor": "V2", "ptype": "Non-Gov", "critical": "high" }, { "vendor": "V3", "ptype": "Non-Gov", "critical": "low" }, { "vendor": "V4", "ptype": "Non-Gov", "critical": "high" }, { "vendor": "V5", "ptype": "Non-Gov", "critical": "high" }, { "vendor": "V6", "ptype": "Non-Gov", "critical": "low" }, { "vendor": "V7", "ptype": "Gov", "critical": "low" }, { "vendor": "V8", "ptype": "Gov", "critical": "high" }, { "vendor": "V9", "ptype": "Non-Gov", "critical": "high" }, { "vendor": "V10", "ptype": "Non-Gov", "critical": "low" }, { "vendor": "V1", "ptype": "Gov", "critical": "high" }, { "vendor": "V2", "ptype": "Gov", "critical": "low" }, { "vendor": "V3", "ptype": "Non-Gov", "critical": "high" }, { "vendor": "V4", "ptype": "Non-Gov", "critical": "high" }, { "vendor": "V5", "ptype": "Non-Gov", "critical": "high" }, { "vendor": "V6", "ptype": "Gov", "critical": "high" }, { "vendor": "V7", "ptype": "Gov", "critical": "high" }, { "vendor": "V8", "ptype": "Non-Gov", "critical": "low" }, { "vendor": "V9", "ptype": "Gov", "critical": "high" }, { "vendor": "V10", "ptype": "Gov", "critical": "low" } ]; 
 

 
var working = input.reduce((p, c) => { 
 
    var v = p[c.vendor]; 
 
    if (!v) v = p[c.vendor] = {Gov: {high: 0, low: 0}, "Non-Gov": {high: 0, low: 0}}; 
 
    v[c.ptype][c.critical]++; 
 
    return p; 
 
    }, {}); 
 

 
var output = Object.keys(working).map(v => ({ [v]: working[v] })); 
 

 
console.log(output);

EDIT: Мне пришло в голову, что, может быть, вы не хотите жестко кодировать возможные значения ptype и critical, поэтому ... следующее (ugl у, unoptimsed) версия захватывает значения, как он идет:

var input = [ { "vendor": "V1", "ptype": "Gov", "critical": "high" }, { "vendor": "V2", "ptype": "Gov", "critical": "low" }, { "vendor": "V3", "ptype": "Gov", "critical": "high" }, { "vendor": "V4", "ptype": "Non-Gov", "critical": "low" }, { "vendor": "V5", "ptype": "Non-Gov", "critical": "high" }, { "vendor": "V6", "ptype": "Gov", "critical": "high" }, { "vendor": "V7", "ptype": "Gov", "critical": "high" }, { "vendor": "V8", "ptype": "Non-Gov", "critical": "low" }, { "vendor": "V9", "ptype": "Non-Gov", "critical": "high" }, { "vendor": "V10", "ptype": "Gov", "critical": "high" }, { "vendor": "V1", "ptype": "Non-Gov", "critical": "low" }, { "vendor": "V2", "ptype": "Non-Gov", "critical": "high" }, { "vendor": "V3", "ptype": "Non-Gov", "critical": "low" }, { "vendor": "V4", "ptype": "Non-Gov", "critical": "high" }, { "vendor": "V5", "ptype": "Non-Gov", "critical": "high" }, { "vendor": "V6", "ptype": "Non-Gov", "critical": "low" }, { "vendor": "V7", "ptype": "Gov", "critical": "low" }, { "vendor": "V8", "ptype": "Gov", "critical": "high" }, { "vendor": "V9", "ptype": "Non-Gov", "critical": "high" }, { "vendor": "V10", "ptype": "Non-Gov", "critical": "low" }, { "vendor": "V1", "ptype": "Gov", "critical": "high" }, { "vendor": "V2", "ptype": "Gov", "critical": "low" }, { "vendor": "V3", "ptype": "Non-Gov", "critical": "high" }, { "vendor": "V4", "ptype": "Non-Gov", "critical": "high" }, { "vendor": "V5", "ptype": "Non-Gov", "critical": "high" }, { "vendor": "V6", "ptype": "Gov", "critical": "high" }, { "vendor": "V7", "ptype": "Gov", "critical": "high" }, { "vendor": "V8", "ptype": "Non-Gov", "critical": "low" }, { "vendor": "V9", "ptype": "Gov", "critical": "high" }, { "vendor": "V10", "ptype": "Gov", "critical": "low" } ]; 
 

 
var working = input.reduce((p, c) => { 
 
    var v = p.vendors[c.vendor]; 
 
    if (!v) v = p.vendors[c.vendor] = {}; 
 
    if (!v[c.ptype]) v[c.ptype] = {}; 
 
    if (!v[c.ptype][c.critical]) v[c.ptype][c.critical] = 1; 
 
    else v[c.ptype][c.critical]++; 
 

 
    p.ptypes[c.ptype] = true; 
 
    p.criticals[c.critical] = true; 
 

 
    return p; 
 
    }, {vendors:{}, ptypes:{}, criticals:{}}); 
 

 
var output = Object.keys(working.vendors).map(v => { 
 
    var c = working.vendors[v]; 
 
    Object.keys(working.ptypes).forEach(p => { 
 
     if (!c[p]) c[p] = {}; 
 
     Object.keys(working.criticals).forEach(q => c[p][q] || (c[p][q] = 0)); 
 
    }); 
 
    return { [v]: c }; 
 
    }); 
 

 
console.log(output);

+0

спасибо nnnnnn! Я искал больше пути d3 .. :) – user6384905

Смежные вопросы