D3.js 按最近时间交叉筛选JSON数据

D3.js 按最近时间交叉筛选JSON数据,d3.js,crossfilter,D3.js,Crossfilter,您好,我在从数据文件中筛选出最新数据时遇到了问题。 我有以下数据 var data= [ {"id":1,"speed":50,time:10:51.30}, {"id":1,"speed":40,time:10:51.40}, {"id":1,"speed":60,time:10:51.50}, {"id":1,"speed":55,time:10:51.55}, {"id":2,"speed":55,time:10:51.50}, {"id":2,"speed":65,time:10:51.

您好,我在从数据文件中筛选出最新数据时遇到了问题。 我有以下数据

var data=
[
{"id":1,"speed":50,time:10:51.30},
{"id":1,"speed":40,time:10:51.40},
{"id":1,"speed":60,time:10:51.50},
{"id":1,"speed":55,time:10:51.55},
{"id":2,"speed":55,time:10:51.50},
{"id":2,"speed":65,time:10:51.58}
]
我想过滤掉数据以可视化或显示最近时间的数据。因此,我的筛选数据应该包含以下内容

var filtereddata=
[
{"id":1,"speed":55,time:10:51.55},
{"id":2,"speed":65,time:10:51.58}
]
如何使用crossfilter从数据中获取过滤后的数据? 我在试着用

var ndx=crossfilter(data);
var dim=ndx.dimension(function(d){return d.time;});
var filter=dim.filter(function(d){d3.max(data,function(d){return d.time;})});

但它不起作用?我该怎么做?

问题是您正在查看筛选器对象。您需要使用顶部或底部将过滤后的dim转换为阵列

请参阅下面的代码,或者更好地查看工作版本

var data=[
{id:1,speed:50, time: new Date('2011-04-11T11:51:00')},
{id:2,speed:40, time: new Date('2011-04-11T11:51:10')},
{id:3,speed:60, time: new Date('2011-04-11T11:51:20')},
{id:4,speed:51, time: new Date('2011-04-11T11:51:30')},
{id:5,speed:55, time: new Date('2011-04-11T11:51:40')},
{id:6,speed:65, time: new Date('2011-04-11T11:51:50')}];




var ndx = crossfilter(data);
var dataByTime = ndx.dimension(function (d) {
    return d.time;
});

var dataBySpeed = ndx.dimension(function (d) {
    return d.speed;
});

//var speedFilter = dataBySpeed.filter(function (d) {});

var timeFilter = dataByTime.filter(function(d){});

//console.log(speedFilter.filterRange([40, 55]).top(3));
console.log(timeFilter.filterRange([new Date('2011-04-11T11:51:00'), new Date('2011-04-11T11:51:40')]).top(3));
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

好吧,我明白你的意思了。请参阅下面更新的代码片段。我还更新了

var数据=[
{id:1,速度:50,时间:新日期('2011-04-11T11:51:00'),
{id:2,速度:40,时间:新日期('2011-04-11T11:51:10'),
{id:2,速度:60,时间:新日期('2011-04-11T11:51:20'),
{id:3,速度:51,时间:新日期('2011-04-11T11:51:30'),
{id:3,速度:55,时间:新日期('2011-04-11T11:51:40'),
{id:3,速度:65,时间:新日期('2011-04-11T11:51:50')};
var uniqueVals=新映射();
data.forEach(函数(d){
var existingVal=uniqueVals.get(d.id);
if(existingVal){
如果(存在值时间
您的代码不符合我的目的。对于您的数据,我应该将所有行作为输出,因为没有重复id的行。例如,如果id:1有多行,我将只接受最近时间的行。这是我的目标。你能帮忙吗?
var data=[
{id:1,speed:50, time: new Date('2011-04-11T11:51:00')},
{id:2,speed:40, time: new Date('2011-04-11T11:51:10')},
{id:2,speed:60, time: new Date('2011-04-11T11:51:20')},
{id:3,speed:51, time: new Date('2011-04-11T11:51:30')},
{id:3,speed:55, time: new Date('2011-04-11T11:51:40')},
{id:3,speed:65, time: new Date('2011-04-11T11:51:50')}];

var uniqueVals = new Map();
data.forEach(function(d){ 
    var existingVal = uniqueVals.get(d.id);
    if (existingVal){
        if (existingVal.time < d.time){
            uniqueVals.set(d.id, d);
        }
    } else {
        uniqueVals.set(d.id, d);
    }
    });

var finalData = [];
uniqueVals.forEach(function(d){ finalData.push(d); });
console.log(uniqueVals);