2014-03-01 34 views

回答

0

我不完全確定「將JSON加載到這些類型中」是什麼意思。我假設解析它的對象文字作爲地圖和數組文字作爲集?

無論如何,答案是否定的。 JSON不會隨ES6而改變,標準JSON對象的API也不會改變。但是,您當然可以很容易地將JSON.parse的結果轉換爲基於地圖的表示形式。

+1

權,但(一)爲什麼不改變它?如果JSON主要關注對象可移植性,那麼不應該將大多數語言更緊密地實現,它們是ES6 Maps的「Object Syntax」,以及它們的Array語法ES6 Sets。當原型無關緊要,並且你不想繼承時,那些匹配不是那麼好的匹配... –

+0

當然可以想象新的功能,即創建地圖和集合的單獨解析函數。但沒有人爲此提出建議。是否足夠取決於用例。特別要注意的是,儘管所有的JSON對象都可以被解析爲地圖,但反過來卻不是這樣:帶有非字符串鍵的地圖沒有JSON表示。可以說,這使得這種映射不那麼自然。另外,JSON經常被簡單地用作JS對象的序列化格式。 –

+0

寫出一個ecmascript 6映射到JSON(stringify),它看起來像一個對象。當從JSON(字符串)中讀取相同的字符串化表示時,它將丟棄關於它以前是帶有Map的對象的所有知識。 – arcseldon

3

Set與Array的含義不同。一個集合是唯一項目的集合,而一個數組是不必要唯一的項目的有序集合。

要將JSON加載到映射而不是關聯數組中,請參閱JSON.parse。您可以編寫自定義解析,就像這樣:

JSON.parse(json, (k, v) => { 
     if(typeof v == 'object' && !(v instanceof Array)) 
      return new Map(Object.entries(v)); 
     return v; 
    }); 

Map需要鍵值對的迭代器,所以我們需要通過Object.entries首先傳遞價值。 Object.entries是一項尚未完成的計劃功能。這是一個實現:

Object.entries = function* entries(obj) { 
    for (let key of Object.keys(obj)) { 
    yield [key, obj[key]]; 
    } 
} 

(他們可能會在Object.prototype.entries決定,而不是在這種情況下,代碼看起來略有不同)