2013-04-17 2 views
16

Я хотел бы получить массив всех данных, связанных с выбором в D3.D3.js: Получите массив данных, привязанных к выделенной области?

Я работаю с примером из General Update pattern, и пытаюсь это:

var text = svg.selectAll("text") 
    .data(data, function(d) { return d; }); 

var textEnter = text.enter().append("text") 
    .attr("class", "enter") 
    .text(function(d) { return d; }); 

console.log('textEnter data', textEnter[0]); 

var textEnterKeys = d3.map(textEnter[0], function(d) { 
    return d.__data__; 
}); 

console.log('textEnterKeys', textEnterKeys); 

Но textEnterKeys выглядит точно так же, как и textEnter. Как я могу получить массив данных, прикрепленных к каждому элементу в списке?

ответ

29

Вы можете просто позвонить по номеру .data() без каких-либо аргументов по выбору для получения связанных данных. См the documentation:

If values is not specified, then this method returns the array of data for the first group in the selection. The length of the returned array will match the length of the first group, and the index of each datum in the returned array will match the corresponding index in the selection. If some of the elements in the selection are null, or if they have no associated data, then the corresponding element in the array will be undefined.

Это не работает для выбора .enter(), поскольку нет никаких элементов, пока, к которым эти данные могут быть связаны. В этом случае функция .map может быть использован:

textEnter.map(function(d) { return d.__data__; }); 
+0

Отлично. Я могу получить данные обновления, выполнив 'text.data()'. Я не могу, однако, получить данные ввода, выполнив 'text.enter(). Data()', как и следовало ожидать, - не могли бы вы рассказать мне, как получить связанные данные для выбора ввода? – Richard

+0

Что вы имеете в виду, когда говорите, что он не получает данные так, как вы ожидали? –

+0

Если я пытаюсь вызвать 'text.enter(). Data()' в строке после 'var text = ....', я получаю 'Uncaught TypeError: Object [object Array] не имеет данных метода '. Однако 'text.data()' работает так же, как вы говорите. – Richard

0

Это старый вопрос, но я также интересно об этом. Состояние прошло через selection.data не потеряно, но оно рассеяно по всему обновлению и введите группы. Он может быть получен, в такте, достаточно надежно с этой функцией ...

function getData2(/*this is update*/) { 
    if (this.enter /*quick duck type test...*/) { 
     var enter = this.enter(), retVal = [] 

     for (var i = 0; i < this.length; i++) { 

      retVal.push([]) 

      for (var j = 0; j < enter.length; j++) { 
       retVal[i].push(enter[i][j] || enter[i].update[j]) 
       retVal[i][j] = retVal[i][j] && retVal[i][j].__data__ 
       if (!retVal[i][j]) { 
        retVal[i].pop() 
       } 
      } 

     } 
     return (this.length > 1 ? retVal : retVal[0]) 
    } 
} 

использование ...

console.log(getData2.call(update)) 

ИЛИ ...

d3.selection.prototype.data2 = getData2 
// ... 
console.log(update.data2()) 

где update является обновление коллекция возвращена выбором.data (array)

0

Или вы можете использовать datum() для получения данных i f вы использовали datum(someData) для привязки.

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