2015-02-08 2 views
11

Я создал набор d3js элементов на основе массива 3-х элементов:Получить один элемент из выбора d3js, по индексу

var data = [[0,0,2],[0,23,5],[2,12,5]]; 
circleSet = svg.selectAll() 
      .data(data) 
      .enter().append('circle'); 

редактировать:

Как я могу выбрать второй элемент, индекс?

+3

Предполагая, что это единственные круги в вашем SVG, вы можете сделать 'd3.select (" circle: nth-child (2) ")'. –

ответ

13

Самый естественный способ манипулировать только один элемент с помощью функции фильтра:

var data = [[0,0,2],[0,23,5],[2,12,5]]; 
circleSet = svg.selectAll() 
     .data(data) 
     .enter() 
     .append('circle') 
     .filter(function (d, i) { return i === 1;}) 
     // put all your operations on the second element, e.g. 
     .append('h1').text('foo');  

Обратите внимание, что в зависимости от того, что вы делаете с другими элементами, вы можете использовать один из двух вариантов такого подхода:

  • вариант а): использовать фильтр в функции данных (для уменьшения данных и прилагаемых элементов)

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

Смотрите также Filter data in d3 to draw either circle or square

Еще один способ сделать это состоит в использовании метода selection.each: https://github.com/mbostock/d3/wiki/Selections#wiki-each используя если заявление с кор отвечающий индекс, вы можете создать блок для одного элемента. .

var data = [[0,0,2],[0,23,5],[2,12,5]]; 
circleSet = svg.selectAll() 
     .data(data) 
     .enter() 
     .append('circle') 
     .each(function (d, i) { 
      if (i === 1) { 
       // put all your operations on the second element, e.g. 
       d3.select(this).append('h1').text(i);  
      } 
      }); 
6

Используйте заданную функцию i переменную, которая ссылается на индекс объекта массива.

var data = [[0,0,2],[0,23,5],[2,12,5]]; 
circleSet = svg.selectAll() 
    .data(data) 
    .enter() 
    .append('circle') 
    .attr('fill',function(d,i){i === 1 ? return 'red' : return 'black' }; 

Найти больше ссылок структуры массива в d3.js at this tutorial

Вы также можете кодировать каждый элемент, добавляемого путем использования подсчета индекса i при присвоении класса.

var data = [[0,0,2],[0,23,5],[2,12,5]]; 
    circleSet = svg.selectAll() 
     .data(data) 
     .enter() 
     .append('circle') 
     .attr("class",function(d,i){ return "yourclass item" + i }) 

var theSecondElement = d3.select(".item1") 

Наконец, вы можете использовать метод .each и условный целевой конкретный элемент

circleSet = svg.selectAll() 
     .data(data) 
     .enter() 
     .append('circle') 
     .each(function (d, i) { 
      if (i === 1) { 
       var that = this; 
       (function textAdd() { 
       d3.select(that).append('h1').text(i); 
      )(); 
      } 
      }); 
+0

Спасибо за ответ. Я отредактировал свой ответ, чтобы спросить, как я могу просто выбрать второй элемент, чтобы я мог каким-то образом манипулировать им? Уже дана вам выдержка. – Rich

+0

вы просто используете .... enter(). Append ('circle'). Each (function (d, i) {if (i === 1) {// здесь вы помещаете все операции над своим вторым элементом}); – ee2Dev

+0

, например. внутри блока вы помещаете d3.select (this) .append ('h1'). text (i); – ee2Dev

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