2017-08-10 38 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); 
相关问题