В ответ Майк опубликовал here, он рассматривает три разных способа применения изменения к согласованному элементу на основе индекса или настраиваемого фильтра. Я пытаюсь разъяснить, надеюсь, для большего количества людей, чем только я, фактический выбор в этих решениях.Выборы в D3, JQuery
Так выдан документ с 6 SVG прямоугольников с классом .bar
, у нас есть эти различные выборы и то, что они возвращаются:
d3.select ("бар."):
[Array[1]
0: rect.[object SVGAnimatedString]
length: 1
parentNode: html
__proto__: Array[0]
d3.selectAll ("бар"):
[Array[6]
0: rect.[object SVGAnimatedString]
1: rect.[object SVGAnimatedString]
2: rect.[object SVGAnimatedString]
3: rect.[object SVGAnimatedString]
4: rect.[object SVGAnimatedString]
5: rect.[object SVGAnimatedString]
length: 6
parentNode: html
__proto__: Array[0]
$ («бар»):
[
<rect class="dataBars" x="53.191489361702125" width="212.7659574468085" y="4.761904761904762" height="11.11111111111111"></rect>,
<rect class="dataBars" x="74.46808510638297" width="372.3404255319149" y="20.634920634920636" height="11.11111111111111"></rect>,
<rect class="dataBars" x="127.6595744680851" width="212.7659574468085" y="36.507936507936506" height="11.11111111111111"></rect>,
<rect class="dataBars" x="31.914893617021274" width="212.7659574468085" y="52.38095238095238" height="11.11111111111111"></rect>,
<rect class="dataBars" x="159.5744680851064" width="265.9574468085106" y="68.25396825396825" height="11.11111111111111"></rect>,
<rect class="dataBars" x="234.04255319148936" width="138.29787234042553" y="84.12698412698413" height="11.11111111111111"></rect>,
]
Теперь вот где получить-х сложнее (для меня по крайней мере), сказать, что я хочу, чтобы применить style
к 3-му прямоугольника, этот прямоугольник можно найти с помощью
d3.selectAll(".bar")[0][2]
Но если мы хотим, чтобы затем использовать d3.selection.attr()
, что возвращает
TypeError: Property 'style' of object #<SVGRectElement> is not a function
Но мы можем обернуть этот выбор
d3.select(d3.selectAll(".bars rect")[0][2]).style("fill", "red")
и это будет работать должным образом.
Тогда, если мы хотим, чтобы применить фильтр, такой, как
filter(function (d) { return d === 5 || d === 15;}
d3.selectAll(".bar")
должны быть использованы, и d3.select(d3.selectAll(".bar"))
не будет работать правильно.
Я прочитал превосходные учебники и документацию Майка по выборам, но когда я думаю, что я понял, что-то всплывает и меня удивляет. Так в чем разница между этими выборами и как я могу узнать, какой из них использовать? Большое спасибо, и извините за длинный пост!
Ну, 'd3.selectAll (". Bar ") [0] [2]' возвращает "необработанный" элемент DOM, а элементы DOM не имеют функции 'style'. 'd3.select (d3.selectAll (". bar "))' не работает, потому что '.select' ожидает либо элемент DOM, либо селектор (строка), но не выбор D3. –