2017-08-10 35 views
2

我有一段時間內發佈的粉絲小說的CSV。它看起來是這樣的:d3的關鍵函數可以處理一個列表元素嗎?

id,published_date,characters 
1,2017-01-01,'['Joe','Bob','Mary']' 
2,2017-01-02,'['Mary']' 
3,2017-01-02,'['Bob','Mary']' 

我有不錯的成功由published_date寫一個關鍵的功能,但現在我想看看我是否可以寫一個關鍵功能characters。因此,對於第一行,Joe,Bob和Mary都將是具有值2017-01-01的密鑰,然後在第二行2017-01-02將被添加到Mary的密鑰。最後,我想在published_date上做一個rollup,以便計算每天發佈的關於Mary的粉絲小說的數量。我認爲最終的數據會是這個樣子:

{ 
Bob: {2017-01-01: 1}, {2017-01-02: 1}, 
Joe: {2017-01-01: 1}, 
Mary: {2017-01-01: 1}, {2017-01-02: 2} 
} 

所以對於published_date,我的代碼看起來像:

var dates = d3.nest() 
       .key(function(d) { return parseDate(d.published_date); }) 
       .rollup(function(v) { return v.length; }) 
       .entries(csv_data); 

如果我characters欄不是一個列表,那麼我相信這會工作:

var dates = d3.nest() 
       .key(function(d) { return d.characters; }) // key by character 
       .key(function(d) { return parseDate(d.published_date); }) 
       .rollup(function(v) { return v.length; }) 
       .entries(csv_data); 

有沒有一種方法可以改變key(function(d) { return d.characters; })來實際創建多個鍵?

謝謝!

回答

2

解開數據,你有正確的答案。

var csv = `id,published_date,characters 
    1,2017-01-01,"[Joe,Bob,Mary]" 
    2,2017-01-02,"[Mary]" 
    3,2017-01-02,"[Bob,Mary]"`; 

var csvData = d3.csvParse(csv, function(r) { 
    return { 
    id: +r.id, 
    publishedDate: new Date(r.published_date), 
    characters: r.characters.slice(1,-1).split(",") 
    }; 
}); 

var data = []; 
csvData.forEach(function(r) { 
    r.characters.forEach(function(c) { 
    data.push({ 
     id: r.id, 
     publishedDate: r.publishedDate, 
     character: c 
    }); 
    }); 
}); 

現在,這應該工作,你希望它的方式。

var nested = d3.nest() 
    .key(function(d) { return d.character; }) 
    .key(function(d) { return d.publishedDate; }) 
    .rollup(function(v) { return v.length }) 
    .entries(data); 
相關問題