diff --git a/src/selection/index.js b/src/selection/index.js index 901c495..e52eb60 100644 --- a/src/selection/index.js +++ b/src/selection/index.js @@ -29,6 +29,7 @@ import selection_clone from "./clone"; import selection_datum from "./datum"; import selection_on from "./on"; import selection_dispatch from "./dispatch"; +import selection_iterator from "./iterator"; export var root = [null]; @@ -73,7 +74,8 @@ Selection.prototype = selection.prototype = { clone: selection_clone, datum: selection_datum, on: selection_on, - dispatch: selection_dispatch + dispatch: selection_dispatch, + [Symbol.iterator]: selection_iterator }; export default selection; diff --git a/src/selection/iterator.js b/src/selection/iterator.js new file mode 100644 index 0000000..5872819 --- /dev/null +++ b/src/selection/iterator.js @@ -0,0 +1,7 @@ +export default function*() { + for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) { + for (var group = groups[j], i = 0, n = group.length, node; i < n; ++i) { + if (node = group[i]) yield node; + } + } +} diff --git a/test/selection/iterator-test.js b/test/selection/iterator-test.js new file mode 100644 index 0000000..7de8ab1 --- /dev/null +++ b/test/selection/iterator-test.js @@ -0,0 +1,27 @@ +var tape = require("tape"), + jsdom = require("../jsdom"), + d3 = require("../../"); + +tape("selection are iterable over the selected nodes", function(test) { + var document = jsdom("

"), + one = document.querySelector("#one"), + two = document.querySelector("#two"); + test.deepEqual([...d3.selectAll([one, two])], [one, two]); + test.end(); +}); + +tape("selection iteration merges nodes from all groups into a single array", function(test) { + var document = jsdom("

"), + one = document.querySelector("#one"), + two = document.querySelector("#two"); + test.deepEqual([...d3.selectAll([one, two]).selectAll(function() { return [this]; })], [one, two]); + test.end(); +}); + +tape("selection iteration skips missing elements", function(test) { + var document = jsdom("

"), + one = document.querySelector("#one"), + two = document.querySelector("#two"); + test.deepEqual([...d3.selectAll([, one,, two])], [one, two]); + test.end(); +});