2016-01-19 4 views
0

У меня есть массив объектовd3 биссектриса не работает с массивом объектов

var s = [{"4":0},{"5":0},{"8":0},{"14":0}]; 

и d3.bisector():

var bd = d3.bisector(function(d,y){ return y;}).left; 

При вызове его как этот

bd(s,5) 

он выводит 0 , Биссектор терпит неудачу, если я использую «ключ» объекта вместо значения в функции accessor. Может кто-то пролить свет на то, почему это происходит?

+0

[Это может помочь] (http://stackoverflow.com/questions/26882631/d3-what-is- a-биссектр) – ozil

+0

Не совсем, Проблема в том, что биссектр выходит из строя, если вы используете объект «ключ» в качестве возвращаемого значения. В противном случае, я знаю, что это работает. –

ответ

0

Вам нужно сделать две корректировки, чтобы сделать его работу:

  1. Чтобы использовать ключи для Comparision, вы должны явно получить доступ к ним. Учитывая ваш массив объектов, это можно сделать с помощью d3.keys(d)[0], тем самым сравнивая первый и единственный ключ. В случае, если вы хотите сравнить число клавиш с цифрами, это будет +d3.keys(d)[0].

  2. Поскольку вы указали свой обратный вызов как function(d,y) {}, то есть принимая два аргумента, ожидается, что функция будет возвращать логические значения компаратором. Самый простой способ в вашем случае будет заключаться в том, чтобы обеспечить обратный вызов с одним аргументом, являющийся аксессуаром к клавишам объектов.

Следующий код должен работать, как ожидалось

s = [{"4":0},{"5":0},{"8":0},{"14":0}]; 
 

 
var bd = d3.bisector(function(d) { 
 
    return +d3.keys(d)[0]; 
 
}).left; 
 

 
console.log(bd(s, 5)); // 1
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script>

+0

спасибо, он работает. –

Смежные вопросы