2013-06-12 1 views
1

У меня есть данные, в которых есть дубликаты дат, но значения всегда будут одинаковыми - как я могу подсчитать появление только один раз и отразить его на гистограмме?Игнорировать повторяющиеся значения даты

Я предполагаю, что мне нужно настроить функцию фильтрации при группировке, я не уверен, как это сделать.

Данные:

var jsonStr = ([ 
    {"date": "2011-11-14", "value": 0.1121}, 
    {"date":"2011-11-25", "value": -0.0231}, 
    {"date":"2011-11-25", "value": -0.0231}, 
    {"date":"2011-11-25", "value": -0.0231} 
]); 

Код:

//setup dimensions 
var dateDimension = ndx.dimension(function (d) { 
    return d.value; 
}); 

var fluctuation = ndx.dimension(function (d) { 
    return Math.round(d.value *10)/10; 
}); 

var fluctuationGroup = fluctuation.group(); 

скрипку: http://jsfiddle.net/wbott70/xtjJn/

ответ

3

Это, вероятно, не самый эффективный способ сделать это, но, используя карту просто и коротко:

var uniqueValues = d3.map([]) 
jsonStr.forEach(function(d){ uniqueValues.set(d.date, d); }); 

newJsonStr = [] 
uniqueValues.forEach(function(d){ newJsonStr.push(uniqueValues.get(d)); }); 

Результат:

[{"date":"2011-11-14","value":0.1121},{"date":"2011-11-25","value":-0.0231}] 
+0

Спасибо Адам. К сожалению, для того, чтобы сделать вопрос простым, я упростил проблему ... там есть другие значения столбцов, которые делают ряды уникальными. Тем не менее, я полагаю, что я мог бы создать новое измерение с новым набором данных - в конечном итоге у меня будет ряд тысяч строк ... – user2464164

+0

Решение по-прежнему работает, если вы используете комбинацию двух свойств для ключа: uniqueValues .set (JSON.stringify (d.date) + JSON.stringify (d.otherField)), d). Не беспокойтесь о тысячах строк; javascript достаточно быстро работает. –

+0

Иди, давай, Адам! – user2464164

1

Лучше бы, вероятно, удалить дубликаты в данных (если вы никогда не нужна эта информация), прежде чем использовать библиотеку Crossfilter, используя следующий код, сразу после определения jsonStr:

var newJson = []; 
for (var i = 0; i < jsonStr.length; i++) { 
    var found = false; 
    for (var j = 0; j < newJson.length; j++) { 
     if (jsonStr[i].date === newJson[j].date) { 
      found = true; 
      break; 
     } 
    } 
    if (!found) { 
     newJson.push(jsonStr[i]); 
    } 
} 
jsonStr = newJson; 
+0

Спасибо - смотри мой ответ выше. Я думаю о загрузке данных, которые я могу выловить дубликаты в отдельный массив (эти данные будут иметь другие уникальные значения столбцов за ту же дату) – user2464164