В чем разница между forEach и each в D3js?
D3 javascript Разница между foreach и каждым
Ответ 1
Во-первых, .forEach() не является частью d3, это нативная функция массивов javascript. Таким образом,
["a", "b", "c"].forEach(function(d, i) { console.log(d + " " + i); });
// Outputs:
a 0
b 1
c 2
И это работает, даже если d3 не загружается на страницу.
Затем d3 .each() работает с выбором d3 (что вы получаете, когда вы d3.selectAll(...)). Технически вы можете вызвать .forEach() на выбор d3, так как за кулисами выбор d3 представляет собой массив с дополнительными функциями (один из них - .each()). Но вы не должны этого делать, потому что:
-
Это не приведет к желаемому поведению. Знание того, как использовать
.forEach()с выбором d3 для создания любого желаемого поведения, потребует глубокого понимания внутренней работы d3. Итак, зачем это делать, если вы можете просто использовать документальную, общедоступную часть API. -
Когда вы вызываете
.each(function(d, i) { })в выборе d3, вы получаете больше, чем простоdиi: функция вызывается так, что ключевое словоthisвнутри этой функции указывает на HTML DOM элемент, связанный сd. Другими словами,console.log(this)изнутриfunction(d,i) {}будет записывать что-то вроде<div class="foo"></div>или любого другого элемента html. И это полезно, потому что тогда вы можете вызвать функцию на этом объектеthis, чтобы изменить его свойства, содержимое CSS или что-то еще. Обычно вы используете d3 для установки этих свойств, как вd3.select(this).style('color', '#c33');.
Основной вывод заключается в том, что при использовании .each() вы получаете доступ к 3 вещам, которые вам нужны: d, this и i. С .forEach() в массиве (как в примере с самого начала) вы получаете только 2 вещи (d и i), и вам нужно будет выполнить кучу работы, чтобы связать элемент HTML с эти две вещи. И это, среди прочего, способ использования d3.