Spaces:
Sleeping
Sleeping
| import "../arrays/map"; | |
| import "../arrays/set"; | |
| import "selection"; | |
| d3_selectionPrototype.data = function(value, key) { | |
| var i = -1, | |
| n = this.length, | |
| group, | |
| node; | |
| // If no value is specified, return the first value. | |
| if (!arguments.length) { | |
| value = new Array(n = (group = this[0]).length); | |
| while (++i < n) { | |
| if (node = group[i]) { | |
| value[i] = node.__data__; | |
| } | |
| } | |
| return value; | |
| } | |
| function bind(group, groupData) { | |
| var i, | |
| n = group.length, | |
| m = groupData.length, | |
| n0 = Math.min(n, m), | |
| updateNodes = new Array(m), | |
| enterNodes = new Array(m), | |
| exitNodes = new Array(n), | |
| node, | |
| nodeData; | |
| if (key) { | |
| var nodeByKeyValue = new d3_Map, | |
| keyValues = new Array(n), | |
| keyValue; | |
| for (i = -1; ++i < n;) { | |
| if (node = group[i]) { | |
| if (nodeByKeyValue.has(keyValue = key.call(node, node.__data__, i))) { | |
| exitNodes[i] = node; // duplicate selection key | |
| } else { | |
| nodeByKeyValue.set(keyValue, node); | |
| } | |
| keyValues[i] = keyValue; | |
| } | |
| } | |
| for (i = -1; ++i < m;) { | |
| if (!(node = nodeByKeyValue.get(keyValue = key.call(groupData, nodeData = groupData[i], i)))) { | |
| enterNodes[i] = d3_selection_dataNode(nodeData); | |
| } else if (node !== true) { // no duplicate data key | |
| updateNodes[i] = node; | |
| node.__data__ = nodeData; | |
| } | |
| nodeByKeyValue.set(keyValue, true); | |
| } | |
| for (i = -1; ++i < n;) { | |
| if (i in keyValues && nodeByKeyValue.get(keyValues[i]) !== true) { | |
| exitNodes[i] = group[i]; | |
| } | |
| } | |
| } else { | |
| for (i = -1; ++i < n0;) { | |
| node = group[i]; | |
| nodeData = groupData[i]; | |
| if (node) { | |
| node.__data__ = nodeData; | |
| updateNodes[i] = node; | |
| } else { | |
| enterNodes[i] = d3_selection_dataNode(nodeData); | |
| } | |
| } | |
| for (; i < m; ++i) { | |
| enterNodes[i] = d3_selection_dataNode(groupData[i]); | |
| } | |
| for (; i < n; ++i) { | |
| exitNodes[i] = group[i]; | |
| } | |
| } | |
| enterNodes.update | |
| = updateNodes; | |
| enterNodes.parentNode | |
| = updateNodes.parentNode | |
| = exitNodes.parentNode | |
| = group.parentNode; | |
| enter.push(enterNodes); | |
| update.push(updateNodes); | |
| exit.push(exitNodes); | |
| } | |
| var enter = d3_selection_enter([]), | |
| update = d3_selection([]), | |
| exit = d3_selection([]); | |
| if (typeof value === "function") { | |
| while (++i < n) { | |
| bind(group = this[i], value.call(group, group.parentNode.__data__, i)); | |
| } | |
| } else { | |
| while (++i < n) { | |
| bind(group = this[i], value); | |
| } | |
| } | |
| update.enter = function() { return enter; }; | |
| update.exit = function() { return exit; }; | |
| return update; | |
| }; | |
| function d3_selection_dataNode(data) { | |
| return {__data__: data}; | |
| } | |