> [Wiki](Home) ? [[API--中文手冊]] ? [[核心函數]] ? **數組**
* 如發現翻譯不當或有其他問題可以通過以下方式聯系譯者:
* 郵箱:zhang_tianxu@sina.com
* QQ群:[D3數據可視化](http://jq.qq.com/?_wv=1027&k=ZGcqYF)205076374,[大數據可視化](http://jq.qq.com/?_wv=1027&k=S8wGMe)436442115
當你使用D3處理數據可視化時,通常會傾向于做大量的**數組操作(array manipulation)**。那是因為數組是D3的標準的數據呈現形式。數組處理的一些常見形式包括:取數組的一個連續片段(子集),使用判定函數過濾數組,使用變換函數映射數組為一組平行的值。在看到D3框架提供的一系列方法處理數組時,你應當很熟悉強大的[JavaScript內置的數組的方法](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/prototype "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/prototype").
JavaScript包含修改數組的**賦值方法(mutator methods)**:
* [array.pop](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/pop) -刪除數組最后一位元素。
* [array.push](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/push) - 往數組的末尾新增一個或多個元素。
* [array.reverse](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reverse) - 把數組元素的逆轉順序。
* [array.shift](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/shift) - 刪除數組第一位元素。
* [array.sort](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort) - 給數組排序。
* [array.splice](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/splice) - 給數組添加或者刪除元素。
* [array.unshift](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/unshift) - 往數組的第一位新增一個或多個元素。
還有一些數組的**[存取方法(accessor methods)](#accessor)**,返回數組的一些描述:
* [array.concat](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/concat) - 合并數組或合并數組的值。
* [array.join](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/join) - 合并數組所有元素拼接成字符串。
* [array.slice](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/slice) - 提取數組的一個選擇。
* [array.indexOf](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf) - 定位到數組第一個值。
* [array.lastIndexOf](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/lastIndexOf) - 定位到數組內最后一個值。
最后,對數組中的元素使用用函數的**迭代方法(iteration methods)**:
* [array.filter](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter) - 由滿足特定條件的元素創建一個新的數組。
* [array.forEach](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach) - 為數組中每一個元素調用一個函數。
* [array.every](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/every) - See if every element in the array satisfies a predicate.
* [array.map](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map) - Create a new array with the result of calling a function on every element in the array.
* [array.some](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/some) - See if at least one element in the array satisfies a predicate.
* [array.reduce](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce) - Apply a function to reduce the array to a single value (from left-to-right).
* [array.reduceRight](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reduceRight) - Apply a function to reduce the array to a single value (from right-to-left).
## 排序 (Ordering)
<a name="d3_ascending" href="#d3_ascending">#</a> d3.**ascending**(*a*, *b*)
如果`a < b`返回-1,`a > b`返回1,`a = b`返回0。
這是固有的比較器方法,也可用于關聯內置數組排序的方法來給元素升序排序:
```javascript
function ascending(a, b) {
return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;
}
```
注意,如果沒有給數組的內置排序方法沒有指定比較器函數,那默認的排序是字典排序(按字母順序排序),而非自然排列!所以當以數組的數字來排序時會導致bug。
<a name="d3_descending" href="#d3_descending">#</a> d3.**descending**(*a*, *b*)
如果`a > b`返回-1,`a < b`返回1,`a = b`返回0。
這是固有的比較器方法,也可用于關聯內置數組排序的方法來給元素降序排序:
```js
function descending(a, b) {
return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN;
}
```
注意,如果沒有給數組的內置排序方法沒有指定比較器函數,那默認的排序是字典排序(按字母順序排序),而非自然排列!所以當以數組的數字來排序時會導致bug。
<a name="d3_min" href="#d3_min">#</a> d3.**min**(*array*[, *accessor*])
返回給定數組(array)中自然排序最小的值。如果數組為空,返回undefined。如果指定了accessor 參數,等同與在計算最小值之前調用了array.map(accessor)方法。不同于內置的[Math.min](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Math/min "https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Math/min"),這個方法會忽略未定義的值;這對比例尺([[d3.scale|比例尺]])定義域計算很有用處,當只考慮數據的定義區域。另外,元素的比較用的是自然排序而不是數字排序。例如,["20","3"]的最小值是20,然而[20,3]的最小值是3。
<a name="d3_max" href="#d3_max">#</a> d3.**max**(*array*[, *accessor*])
返回給定數組(array)中自然排序最大的值。如果數組為空,返回undefined。如果指定了accessor 參數,等同與在計算最大值之前調用了array.map(accessor)方法。而并非內置的Math.max,這個方法會忽略未定義的值;這對當只需要定義數據的區域的比例尺定義域計算很有用處。另外,元素的比較用的是自然排序而不是數字排序。例如,["20","3"]的最大值是3,然而[20,3]的最大值是20。
<a name="d3_extent" href="#d3_extent">#</a> d3.**extent**(*array*[, *accessor*])
返回給定數組(array)自然排序的最小值和最大值,等同于同時調用[d3.min](#d3_min)和[d3.max](#d3_max).
<a name="d3_sum" href="#d3_sum">#</a> d3.**sum**(*array*[, *accessor*])
返回給定數組(array)的和。如果數組為空,返回 0。可選參數accessor函數 被指定,等同于在計算和之前調用*array.map(accessor)* 。此方法忽略無效值(如`NaN` 和`undefined`);當只考慮明確定義的值時,這個方法可用于計算數據的和。
<a name="d3_mean" href="#d3_mean">#</a> d3.**mean**(*array*[, *accessor*])
返回給定數組(array)的平均數。如果數組為空,返回 `undefined`。可選參數accessor函數 被指定,等同在計算平均數之前調用*array.map(accessor)* 。此方法忽略無效值(如`NaN` 和`undefined`),當只考慮明確定義的值時這個方法計算數據和是很有用的。
<a name="d3_median" href="#d3_median">#</a> d3.**median**(*array*[, *accessor*])
返回給定數組(array)以[R-7算法](http://en.wikipedia.org/wiki/Quantile#Quantiles_of_a_population "http://en.wikipedia.org/wiki/Quantile#Quantiles_of_a_population")得出的中位數。如果數組為空,返回 undefined。可選參數accessor 被指定,等同在計算中位數之前調用*array.map(accessor)* 。此方法忽略無效值(如`NaN` 和`undefined`) ,當只考慮明確定義的值時這個方法計算數據和是很有用的。
<a name="d3_quantile" href="#d3_quantile">#</a> d3.**quantile**(*numbers*, *p*)
返回給定數組*numbers*的*p*分位數,其中p 是一個0到1范圍的數。例如,中位數可以由p = 0.5計算,第一個四分位數是p = 0.25,第三個四分位數是p = 0.75。這個特別實現了[R-7算法](http://en.wikipedia.org/wiki/Quantile#Quantiles_of_a_population "http://en.wikipedia.org/wiki/Quantile#Quantiles_of_a_population"),這是R編程語言和Excel默認的方式。這個方法需要數組numbers包含數字且數字升序順序排列,例如使用 [d3.ascending](#d3_ascending)排序。
```js
var a = [0, 1, 3];
d3.quantile(a, 0); // return 0
d3.quantile(a, 0.5); // return 1
d3.quantile(a, 1); // return 3
d3.quantile(a, 0.25); // return 0.5
d3.quantile(a, 0.75); // return 2
d3.quantile(a, 0.1); // return 0.19999999999999996
```
<a name="d3_variance" href="#d3_variance">#</a> d3.**variance**(*array*[, *accessor*])
返回給定數組(array)的無偏總體方差([unbiased estimator of the population variance](http://mathworld.wolfram.com/SampleVariance.html “http://mathworld.wolfram.com/SampleVariance.html”))。如果數組的長度小于2,返回`undefined`。可選參數accessor 被指定,等同在計算中位數之前調用*array.map(accessor)* 。此方法忽略無效值(如`NaN` 和`undefined`)。
<a name="d3_deviation" href="#d3_deviation">#</a> d3.**deviation**(*array*[, *accessor*])
返回給定數組(array)的標準差,即方差([bias-corrected variance](#d3_variance))的平方根。如果數組的長度小于2,返回`undefined`。可選參數accessor 被指定,等同在計算中位數之前調用*array.map(accessor)* 。此方法忽略無效值(如`NaN` 和`undefined`)。
<a name="d3_bisectLeft" href="#d3_bisectLeft">#</a> d3.**bisectLeft**(*array*, *x*[, *lo*[, *hi*]])
定位數組 *array* 中的 *x* 的插入點,以保持已有序列。參數 *lo* 和 *hi* 用來指定數組的子集;默認情況下整個數組都被使用。如果 *x* 在 *array* 中已存在,插入點在所有元素之前(左側)。返回值適合用作拼接([splice](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/splice))*已經排序的*數組*array* 的第一個參數。返回的插入點*i*把*array* 分為兩個區:數組中所有*array*.slice(lo, i)中`v < x` 的v在左邊,數組中所有 *array*.slice(i, hi)中`v >= x` 的v在右邊。
<a name="d3_bisect" href="#d3_bisect">#</a> d3.**bisect**(*array*, *x*[, *lo*[, *hi*]])</br>
<a name="d3_bisectRight" href="#d3_bisectRight">#</a> d3.**bisectRight**(*array*, *x*[, *lo*[, *hi*]])
和bisectLeft類似,但返回插入點來自于數組*array*中任意實體*x*之后(右側)。返回的插入點*i*把*array* 分為兩個區:數組中所有*array*.slice(lo, i)中`v <= x`的v在左邊,數組中所有 *array*.slice(i, hi)中`v > x` 的v在右邊。
<a name="d3_bisector" href="#d3_bisector">#</a> d3.**bisector**(*accessor*)
<br><a name="d3_bisector" href="#d3_bisector">#</a> d3.**bisector**(*comparator*)
使用指定參數*accessor*或者*comparator* 函數返回一個二等分線。返回的對象有`left` 和`right` 屬性,分別類似于[bisectLeft](#d3_bisectLeft)和[bisectRight](#d3_bisectRight)方法。這個方法能用于二等分對象數組而不適用于原始的簡單數組。例如下列對象的數組:
```js
var data = [
{date: new Date(2011, 1, 1), value: 0.5},
{date: new Date(2011, 2, 1), value: 0.6},
{date: new Date(2011, 3, 1), value: 0.7},
{date: new Date(2011, 4, 1), value: 0.8}
];
```
一個合適的二等分函數可定義為:
```js
var bisect = d3.bisector(function(d) { return d.date; }).right;
```
然后調用`bisect(data, new Date(2011, 1, 2))`,返回索引。
如果你想使用不同于自然排序的方法對值進行排序,那么可以使用比較器(comparator)而不是訪問器(accessor),例如降序排序而不是升序排序的時候。
```js
var bisect = d3.bisector(function(a, b) { return a.date - b.date; }).right;
```
<a name="d3_shuffle" href="#d3_shuffle">#</a> d3.**shuffle**(*array*[, *lo*[, *hi*]])
使用[Fisher–Yates shuffle](http://bost.ocks.org/mike/shuffle/)來把傳入參數*array*隨機排序.
## 關聯數組 (Associative Arrays)
關聯數組(字典)和數組類似,由以名稱作為鍵的字段和方法組成。
它包含標量數據,可用索引值來單獨選擇這些數據,和數組不同的是, 關聯數組的索引值不是非負的整數而是任意的標量。這些標量稱為Keys,可以在以后用于檢索數組中的數值.
JavaScript 中另一種常見數據類型就是關聯數組,或者簡單說就是具有一系列命名屬性的對象。在Java中簡稱映射(鍵值對) map,而在Python中稱為字典dictionary。JavaScript為關聯數組中鍵(屬性名稱)的迭代提供一個標準機制:那就是 [for…in loop](https://developer.mozilla.org/en/JavaScript/Reference/Statements/for...in)。然而,注意迭代的次序是未定義的。D3提供了一些將關聯數組轉化為索引數組的方法。
<a name="d3_keys" href="#d3_keys">#</a> d3.**keys**(*object*)
返回一個包含指定對象(關聯數組) 屬性名稱的數組。返回數組的順序未定義。
<a name="d3_values" href="#d3_values">#</a> d3.**values**(*object*)
返回一個包含指定對象(關聯數組) 屬性值的數組。返回數組的順序未定義。
<a name="d3_entries" href="#d3_entries">#</a> d3.**entries**(*object*)
返回一個包含對象(*object*)(一個關聯數組)中名稱以及值(鍵和值, key and value)的數組 (array)。每一個實體都是有鍵值對的對象,例如`{key: "foo", value: 42}`。返回數組的順序未定義。
```js
d3.entries({foo: 42, bar: true}); // returns [{key: "foo", value: 42}]
```
### 映射(Maps)
當你嘗試在JavaScript中用空對象作為map,當內部屬性名稱(鍵)作鍵時,會導致[意外的行為(unexpected behavior)](http://www.devthought.com/2012/01/18/an-object-is-not-a-hash/)。比如,當你設置`object["__proto__"] = 42`時,最終不會達到你理想中的結果。又如你嘗試查詢給定key是否在map中定義了;"hasOwnProperty" in object 返回true,因為空對象(從對象原型)繼承了hasOwnProperty方法。為避免這些問題,ES6提出了[簡單映射和集合(simple maps and sets)](http://wiki.ecmascript.org/doku.php?id=harmony:simple_maps_and_sets) 理論。直到現代瀏覽器支持了這些集合,你可以使用[d3.map]替代.
注意:不同于建議的 ES6 map ,d3.map的key仍然強制使用字符串,而不是嚴格的相等。
<a name="d3_map" href="#d3_map">#</a> d3.**map**([*object*][, *key*])
構建一個新的map,如果指定參數*object*,復制參數*object*對象內所有枚舉屬性到map中。參數對象可能是數組. 可以使用一個鍵*key*函數來計算數組里每個數值的鍵. 如下:
```js
var m = d3.map([{name: "foo"}, {name: "bar"}], function(d) { return d.name; });
m.get("foo"); // {"name": "foo"}
m.get("bar"); // {"name": "bar"}
m.get("baz"); // undefined
```
參見 [d3.nest](#d3_nest)。
<a name="map_has" href="#map_has">#</a> map.**has**(*key*)
當且僅當map有指定key的實體時返回true。注意:該值可能是`null` 或`undefined`。
<a name="map_get" href="#map_get">#</a> map.**get**(*key*)
返回參數*key*的值。如果map中沒有參數*key*相同元素,返回`undefined`。
<a name="map_set" href="#map_set">#</a> map.**set**(*key*, *value*)
指定*key*的*value* ;返回新的*value*。如果map之前同樣的*key* 有一個實體了,那么舊實體被新值替代。
<a name="map_remove" href="#map_remove">#</a> map.**remove**(*key*)
若map有指定*key*的實體,刪除此實體并返回`true`。否則,此方法不做任何操作,返回`false`。
<a name="map_keys" href="#map_keys">#</a> map.**keys**()
返回在這個map所有的鍵的數組。返回鍵的集合順序是隨機的。
<a name="map_values" href="#map_values">#</a> map.**values**()
返回在這個map所有的值的數組,返回值的集合順序是隨機的。
<a name="map_entries" href="#map_entries">#</a> map.**entries**()
返回一個map內所有鍵-值對象的數組。返回元素的集合順序是隨機的。任何元素的鍵必須是字符串類型,但值可為任何類型。
<a name="map_forEach" href="#map_forEach">#</a> map.**forEach**(*function*)
給map中每個元素調用一個指定函數*function*,傳遞元素的鍵和值作為兩個參數。*function*的使用的`this`指針將指向這個map。返回`undefined`。迭代的順序是隨機的。
<a name="map_empty" href="#map_empty">#</a> map.**empty**()
返回`true`當且僅當map中沒有元素。
<a name="map_size" href="#map_size">#</a> map.**size**()
返回map中元素的個數
### 集合(Sets)
<a name="d3_set" href="#d3_set">#</a> d3.**set**([*array*])
新建一個集合,如果指定了*array* ,添加*array* 的字符串值到返回集合中。
<a name="set_has" href="#set_has">#</a> set.**has**(*value*)
當且僅當集合中具有指定參數*value* 字符串相同的實體,返回`true`。
<a name="set_add" href="#set_add">#</a> set.**add**(*value*)
添加指定參數*value* 字符串到集合中.
<a name="set_remove" href="#set_remove">#</a> set.**remove**(*value*)
如果集合中含有指定參數*value* 字符串相同元素,返回`true`并刪除元素。否則,這個方法不做任何操作,并返回`false`。
<a name="set_values" href="#set_values">#</a> set.**values**()
返回一個由集合中所有字符串類型值組成的數組。數組中的值的順序為隨機的。可作為集合中唯一值的簡便計算方法(去重)。例如:
```js
d3.set(["foo", "bar", "foo", "baz"]).values(); // "foo", "bar", "baz"
```
<a name="set_forEach" href="#set_forEach">#</a> set.**forEach**(*function*)
給集合中每個元素調用一個指定*function*,傳遞元素的值作為參數。*function*的使用的`this`指針將指向這個map。返回`undefined`,迭代的順序是隨機的。
<a name="set_empty" href="#set_empty">#</a> set.**empty**()
當且僅當集合中沒有值,返回`true`。
<a name="set_size" href="#set_size">#</a> set.**size**()
返回集合中值的個數。
## 數組運算符 (Array Operators)
<a name="d3_merge" href="#d3_merge">#</a> d3.**merge**(*arrays*)
合并指定參數*arrays* 為一個數組,此方法和數組內置方法`concat` 類似;唯一不同是當你要處理二維數組時,`d3.merge(arrays)`方法更方便。
```js
d3.merge([ [1], [2, 3] ]); // returns [1, 2, 3]
```
<a name="d3_range" href="#d3_range">#</a> d3.**range**([*start*, ]*stop*[, *step*])
生成一個包含算數級數的數組,類似于Python的內置函數[range](http://docs.python.org/library/functions.html#range "http://docs.python.org/library/functions.html#range")。這個方法常用來遍歷一個數字序列或者整型數值。例如數組中的索引。不同于Python版本,這個參數不必是整形。盡管如果它們是浮點精度類型時這個結果更加可預測。如果省略*step*,默認值是1。如果省略*start*參數,默認值就是0。結果中不包含*stop*值。完整的形式是返回一個數字數組`[start,start+step,start+2 *step,…]`。如果*step*是正的,則最后一個元素是小于`stop`的`start+ i*step`中的最大數值;如果*step*是負的,最后一個元素是大于`stop`的`start + i*step`中的最小數值。如果返回的數組將包含值無限多數字,就會拋出一個錯誤,而不是造成無限循環。
<a name="d3_permute" href="#d3_permute">#</a> d3.**permute**(*array*, *indexes*)
使用指定的*indexes*數組返回指定數組的轉置。返回數組包含indexes數組中索引對應的元素,按順序。例如,`permute(["a", "b", "c"], [1, 2, 0])` 返回 `["b", "c", "a"]`。indexes數組的長度和array中的元素長度不一樣是可以接受的,并且允許indexes數組重復或者省略。
這個方法可以用來按固定順序提取對象中的值到一個數組中。(在JavaScript中indexes數組是和`.length`有特殊關系的簡單屬性)。按順序提取帶鍵的值可以用來生成嵌套選擇中的數據數組。例如,我們可以用表格形式展示上述的一些明尼蘇達州大麥產量數據:
```javascript
var cols = ["site", "variety", "yield"];
thead.selectAll('th').data(cols)
.enter().append('th').text(function (d) { return d.toUpperCase(); });
tbody.selectAll('tr').data(yields)
.enter().append('tr').selectAll('td').data(function (row) { return d3.permute(row, cols); })
.enter().append('td').text(function (d) { return d; });
```
<a name="d3_zip" href="#d3_zip">#</a> d3.**zip**(*arrays…*)
返回的數組的數組,其中,第i個數組包含來自每個*arrays*參數的第i個元素。返回的數組長度被截斷為*arrays*的最短的數組的長度。如果*arrays*只包含一個數組,則返回的數組是包含一個元素的數組。不帶任何參數,則返回的數組是空的。
```js
d3.zip([1, 2], [3, 4]); // returns [[1, 3], [2, 4]]
```
<a name="d3_transpose" href="#d3_transpose">#</a> d3.**transpose**(*matrix*)
等價于`d3.zip.apply(null, matrix)`;使用zip操作符作為二維矩陣變換([matrix transpose](http://en.wikipedia.org/wiki/Transpose))。
<a name="d3_pairs" href="#d3_pairs">#</a> d3.**pairs**(*array*)
對指定參數array中元素的每個相鄰對,返回元組(元素i和元素i-1)的新數組。例如:
```js
d3.pairs([1, 2, 3, 4]); // returns [[1, 2], [2, 3], [3, 4]]
```
如果指定參數array 中少于兩個元素,則返回一個空數組。
### 嵌套 (Nest)
嵌套允許數組中的元素被組織為分層樹型結構;類似SQL語句里面的GROUP BY方法,但不能多級別分組,而且輸出的結果是樹而不是一般的表。樹的層級由key方法指定。樹的葉節點可以按值來排序,而內部節點可以按鍵來排序。可選參數匯總(rollup)函數可以使用加法函數瓦解每個葉節點的元素. nest 操作符([d3.nest](#d3_nest)返回的對象)是可以重復使用的,不保留任何嵌套數據的引用。
例如,思考下面1931-2年間明尼蘇達州(美國州名)麥田地皮的表格數據結構:
```js
var yields = [{yield: 27.00, variety: "Manchuria", year: 1931, site: "University Farm"},
{yield: 48.87, variety: "Manchuria", year: 1931, site: "Waseca"},
{yield: 27.43, variety: "Manchuria", year: 1931, site: "Morris"}, ...]
```
為了方便查看,可以嵌套元素首先按year然后按variety,如下:
```js
var nest = d3.nest()
.key(function(d) { return d.year; })
.key(function(d) { return d.variety; })
.entries(yields);
```
返回的嵌套數組中。每個元素的外部數組是鍵-值對,列出每個不同鍵的值:
```js
[{key: 1931, values: [
{key: "Manchuria", values: [
{yield: 27.00, variety: "Manchuria", year: 1931, site: "University Farm"},
{yield: 48.87, variety: "Manchuria", year: 1931, site: "Waseca"},
{yield: 27.43, variety: "Manchuria", year: 1931, site: "Morris"}, ...]},
{key: "Glabron", values: [
{yield: 43.07, variety: "Glabron", year: 1931, site: "University Farm"},
{yield: 55.20, variety: "Glabron", year: 1931, site: "Waseca"}, ...]}, ...]},
{key: 1932, values: ...}]
```
嵌套的形式可以在SVG或HTML很容易迭代和生成層次結構。
有關 `d3.nest` 詳見:
* Phoebe Bright’s [D3 Nest Tutorial and examples](http://bl.ocks.org/phoebebright/raw/3176159/)
* Shan Carter’s [Mister Nester](http://bl.ocks.org/shancarter/raw/4748131/)
<a name="d3_nest" href="#d3_nest">#</a> d3.**nest**()
創建一個新操作符。keys集合初始為空。如果[map](#nest_map)或[entries](#nest_entries) 操作符在任何鍵函數被注冊之前被調用,這個嵌套操作符通常返回輸入數組。例如http://bl.ocks.org/phoebebright/raw/3176159/
<a name="nest_key" href="#nest_key">#</a> nest.**key**(*function*)
注冊一個新的鍵函數*function*。鍵函數將被輸入數組中的每個元素調用,并且必須返回一個用于分配元素到它的組內的字符串標識符。通常,這個函數被實現為一個簡單的訪問器,如上面例子中year和variety的訪問器。 輸入的數組的引導(index)并*沒有*傳遞給*function*。每當一個key 被注冊,它被放到一個內部鍵數組的末端,和由此產生的map或實體將有一個額外的層級。當前沒有一個方法可以刪除或查詢注冊的鍵。最近注冊的鍵在后續的方法中被當作當前鍵。
<a name="nest_sortKeys" href="#nest_sortKeys">#</a> nest.**sortKeys**(*comparator*)
使用指定的參數*comparator*來給當前鍵值排序,等效于[d3.descending](#d3_descending)。如果沒有指定comparator 參數鍵的排序則返回undefined。注意:只影響實體操作符的結果;map操作符返回鍵的順序永遠是undefined,無論什么比較器。
```js
var nest = d3.nest()
.key(function(d) { return d.year; })
.sortKeys(d3.ascending)
.entries(yields);
```
<a name="nest_sortValues" href="#nest_sortValues">#</a> nest.**sortValues**(*comparator*)
使用指定的*comparator*參數給葉子元素排序,等效于[d3.descending](#d3_descending)。這相當于在應用nest操作符前給輸入的數組排序;然而,當每一組更小時它通常是更有效的。如果沒有指定值的比較器,元素則按輸入數組中顯示的順序排列。通常用于map和實體(entries)的操作符。
<a name="nest_rollup" href="#nest_rollup">#</a> nest.**rollup**(*function*)
為每組中的葉子元素指定匯總函數(rollup )*function*。匯總函數的返回值會覆蓋葉子值數組。不論是由map操作符返回的關聯數組,還是實體操作符返回的每個實體的值屬性。
<a name="nest_map" href="#nest_map">#</a> nest.**map**(*array*[, *mapType*])
對指定的數組使用nest操作符,返回一個關聯數組。返回的關聯數組*array*中每個實體對應由第一個key函數返回的不同的key值。實體值決定于注冊的key函數的數量:如果有一個額外的key,值就是另外一個嵌套的關聯數組;否則,值就是過濾自含有指定key值得輸入數組*array*的元素數組。
如果指定了*mapType*,指定的函數就會用來構造一個map而不是返回一個簡單的JavaScript對象。推薦使用[d3.map](#d3_map) 實現這個目的,例如:
```js
var yieldsByYearAndVariety = d3.nest()
.key(function(d) { return d.year; })
.key(function(d) { return d.variety; })
.map(yields, d3.map);
```
使用d3.map而不是一個對象提供便捷(例如:返回的map含有 [keys](#map_keys) 和 [values](#map_values) 函數),防止不尋常的鍵名與JavaScript內置的屬性沖突,例如`__proto__`。
<a name="nest_entries" href="#nest_entries">#</a> nest.**entries**(*array*)
為指定的*array*參數應用nest操作符,返回一個鍵值對數組。從概念上講,這和對 [map](#nest_map) 返回的關聯數組應用 [d3.entries](#d3_entries) 操作符類似,但是這個是用于每一層而不是只有第一層(最外層)。返回數組中的每個實體對應于第一個key函數返回的不同的key值。實體值取決于注冊的key函數的數量:如果有一個關聯的key,值就是另外一個嵌套實體數組;否則,值就是含有指定key值得輸入數組*array*過濾得到的元素數組。嵌套的案例: http://bl.ocks.org/phoebebright/raw/3176159/
[<a name="accessor" href="#">1</a>] accessor function, 亦為getter, callback, 訪問器, 常譯作‘回調(函數)’。[術語翻譯 (計算機軟件/編程)](http://www.douban.com/group/topic/22835269/ "http://www.douban.com/group/topic/22835269/") // Howard Liang 注 Nov 27, 2015
* Carry on 、2014-3-29翻譯
* 咕嚕2014-11-18翻譯,并校對之前的翻譯。