Разница между функцией (d) и функцией (d, i)?

Каждый D3js beginner должен пройти эту мысль, я в этом очень уверен.

Я обошел эту штуку в течение нескольких часов сейчас!!!! Но я не знаю, как ее использовать и что такое разница между ними?

function(d){return d}

function(d,i){return d and some more custom code}

для примера --- >

var data = [4, 8, 15, 16, 23, 42];

    Function(d):::::

    chart.selectAll("div")
         .data(data)
         .enter().append("div")
         .style("width", function(d) { return d * 10 + "px"; })
         .text(function(d) { return d; });

    ------------------------------------------------------------------------------------

 Function(d*i):::::

    chart.selectAll("rect")
        .data(data)
        .enter().append("rect")
        .attr("y", function(d, i) { return i * 20; })
        .attr("width", x)
        .attr("height", 20);

Ответ 1

Ваш пример - хороший иллюстратор различия между ними.

В первом примере используется только d. d представляет данные, связанные с данным выбором. В этом случае создается массив из выбранных элементов div, по одному для каждого элемента в массиве data:

chart.selectAll("div")
     .data(data)
     .enter()
     .append("div")

Это не только создает массив элементов div, но и связывает данные с каждым из этих элементов. Это делается на основе "один к одному", причем каждый div соответствует одному элементу массива data. Один из них связан с "4", один с "8" и т.д.

Если я затем использую .text(function(d){...}) в массиве выборок, d будет ссылаться на данные, связанные с каждым выбранным div, поэтому, если я использую следующий метод для своих выборов:

.text(function(d) { return d; });

В каждом из моих div будет добавлен текст, значение которого равно d или данные, связанные с элементом.

Когда создается массив выборов, им также присваивается индекс в массиве. В вашем примере это соответствует положению их данных в массиве данных. Если ваша функция запрашивает как d, так и i, то i будет соответствовать этому индексу. Возвращаясь к div s, div, связанный с '4', будет иметь индекс '0', '8' будет иметь индекс '1' и т.д.

Также важно отметить, что символ, используемый в запрошенной переменной, не имеет значения. Первой переменной в вызове функции всегда являются данные, а вторая - индекс. Если я использовал метод типа

.text(function(cat,moose){ return( "data is: " + cat + " index is: " + moose)})

cat будет соответствовать данным выбора, а moose будет соответствовать индексу.

Ответ 2

Я надеюсь, что этот пример поможет вам. Это полная веб-страница, где вы можете начать играть:

<!doctype html>
<meta charset="utf-8">
<title>my first d3</title>
<body>

<script>
  var data=[10,20,30,40];

  var lis = d3.select("body")
              .append("ul")
              .selectAll("li")
              .data(data)

  lis.enter()
     .append("li")
     .text(function(d,i){ return "item n° "+i+" has value: "+d})
</script>

В основном d - это значение данных, а i - его индекс. Вы можете посмотреть здесь этот пример: http://jsfiddle.net/M8nK8/

Ответ 3

Если вы говорите о функциях обратного вызова, вы переходите к таким методам, как .attr(), тогда функция вызывается для каждого элемента в текущий выбор, где i дает вам индекс текущего элемента, но в зависимости от того, что вы делаете, вам может не понравиться этот индекс. Поэтому, хотя D3.js всегда будет вызывать вашу функцию с обоими аргументами, если вам действительно не нужен второй аргумент в конкретном случае, ваша функция не должна явно объявлять его.

JavaScript позволяет вам вызывать любую функцию с любым количеством аргументов независимо от того, сколько из них явно включено в объявление функции. Если вы вызываете функцию с меньшим количеством аргументов, чем были определены, остатки получат значение undefined. Если вы вызываете функцию с большим количеством аргументов, чем были определены, вы все равно можете получить доступ к дополнительным из функции, используя arguments object - или вы можете игнорировать их.

(Примечание: у вас должен быть строчный f в function().)