2012-05-22 2 views
2

Я использую jQuery для ввода строки чисел с запятой для целей построения в D3. Я пытаюсь получить максимум этого массива, но все идет не так хорошо.Получите реальный максимум массива в D3

var x_data = $('.CostImport').text().split(','); 
var y_data = $('.PriceImport').text().split(','); 
var r_data = $('.SalesImport').text().split(','); 
var c_data = $('.ZoneImport').text().split(','); 


for (i = 0; i < x_data.length; i++) { 
    data.push({ "x": x_data[i], "y": y_data[i], "c": c_data[i], "r": r_data[i] }); 
    } 

alert(d3.max(r_data)); 
alert(d3.max(data, function (d) { return d.r })); 

Оба этих предупреждения передают мне то же число, что и неверно. Фактический максимум - 928870, но я возвращаюсь на 9975. Запланировка работает нормально (разброс, с определением размера и цвета c), поэтому я немного смущен, почему я не могу вытащить максимальное число.

Любые идеи?

ответ

5

Похоже, что значения обрабатываются как строки. Вам нужно будет использовать parseInt или parseFloat (в зависимости от точности значений), чтобы преобразовать их в целые числа для функции max, чтобы работать так, как вы ожидаете.

Вот быстрая функция преобразования строкового массива в int. Это было бы лучше, прототип, но для быстрого и грязного, например, это будет работать:

function toIntArray(arr) { 
    for (var i = 0; i < arr.length; i++) { 
     arr[i] = +arr[i]; 
    } 
    return arr; 
} 

свой код, как есть, но изменить эти строки:

r_data = toIntArray(r_data); 
data = toIntArray(data); 

alert(d3.max(r_data)); 
alert(d3.max(data, function (d) { return d.r })); 
+0

Так я изменил свой первоначальный код предупреждения (d3.max (данные, функции (d) {возвращение ParseInt (d.r)})); и он работал. Что странно, так это то, что когда я рисовал его раньше, у меня была шкала и использовалась d3.max (r_data) для максимального значения. Элемент с 9975 действительно установил радиус max, что означает, что предметы со 1000000+ заняли весь экран. Таким образом, d3 распознает их как числа при построении графика, но не при поиске максимума. – ScottieB

+0

Рад это услышать. Функция 'toIntArray' должна помочь вам, если вам нужно использовать функции сортировки или сравнения на других массивах. –

+1

Я бы предположил, что d3 имеет внутреннюю проверку, которая преобразует значения в int для построения графика, но не в макс. –

0

столкнулся с этой же проблемой, но я имел дело с объектом данных, а не с массивом. Найденная функция фильтра в d3 весьма полезна при преобразовании строк в цифры. Ниже приведен пример

data.filter(function(d,i) { 
    d.x = +d.x; 
d.y = +d.y; 
}); 

xmax = d3.max(data, function (d) { return d.x }); 
console.log(xmax);