Ключом к пониманию того, что делает этот код, является признание того, что выборки - это массивы массивов элементов DOM. Самый внешний массив называется «выбором», внутренний массив (ы) называются «группами», и эти группы содержат элементы DOM. Вы можете проверить это, зайдя в консоль d3js.org и сделав выбор, например, d3.selectAll ('p'), вы увидите массив, содержащий массив, содержащий элементы 'p'.
В вашем примере, когда вы впервые вызываете selectAll ('tr'), вы получаете выделение с одной группой, которая содержит все элементы 'tr'. Затем каждый элемент matrix
сопоставляется с каждым элементом 'tr'.
Но когда вы вызываете selectAll ('td') для этого выбора, выбор уже содержит группу элементов 'tr'. На этот раз каждый из этих элементов станет группой элементов 'td'. Группа - это просто массив, но она также имеет свойство parentNode, которое ссылается на старый выбор, в данном случае это элементы 'tr'.
Теперь, когда вы вызываете data(function(d) { return d; })
для этого нового набора элементов 'td', d
представляет данные, связанные с родительским узлом каждой группы. Таким образом, в примере 'td в первой группе будут связаны с массивом [11975, 5871, 8916, 2868]. Вторая группа 'td's связана с [1951, 10048, 2060, 6171].
Вы можете прочитать собственное отличное объяснение выборов Майка Бостока и привязку данных здесь: http://bost.ocks.org/mike/selection/