2015-11-23 46 views
12

下面的ES6代碼片段無效。它曾經是有效的。我仍然可以在老版本的Traceur中運行它,但最新的Babel和Traceur似乎不再喜歡陣列中的for循環。誰能告訴我爲什麼它不再有效。ES6陣列解析不再有效嗎?

let people = [ 
    { 
     "firstName": "Belinda", 
     "phone": "1-607-194-5530", 
     "email": "[email protected]" 
    }, 
    { 
     "firstName": "Elizabeth", 
     "phone": "1-155-446-1624", 
     "email": "[email protected]" 
    } 
] 

let phones = [for({phone} of people) phone]; 
console.log(phones) 

以下代碼段是有效的ES6所以我知道自毀內部的for循環是OK

for(let {phone} of people) { 
    console.log(phone) 
} 
+3

這是一個[陣列理解](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Array_comprehensions),它是從未在ES6降落的實驗建議/ ES2015 –

回答

18

陣列內涵是removed in BabelJS version 6ES2015 Specification沒有提及理解,所以他們可能被丟棄。通過ES Discuss郵件列表檔案快速搜索任何明確的內容都是空白的。

作爲稍微更詳細的替代方案,有Object.entries(ES7中的stage-3功能)和Array.prototype.map

let emails = people.map(({ email }) => email); 
+4

或者:'Array.from(people,({email})=> email);'這將適用於任何迭代。 – loganfsmyth

+3

爲什麼'Object.entries'? 'people'是一個數組,你想要一個簡單的'people.map(_ => _.email)' – Bergi

+1

Thanks @bergi。我真的不能說。由於某種原因,我疲憊的眼睛讓人產生了一種反應我更新了片段。 –

7

誰能告訴我,爲什麼它不再有效。

陣列理解沒有使它成爲ES6的最終版本,它似乎並沒有被認爲是下一個版本之一:https://github.com/tc39/ecma262

9

http://exploringjs.com/es6/ch_faq.html#_does-es6-have-array-comprehensions是有幫助的:

最初,ES6是有陣列和發電機內涵 (類似於Haskell和Python)的。但他們推遲到以後 ES6,因爲TC39想探索兩款途徑:

  • 它可能會創建一個任意 數據類型(認爲微軟的LINQ)工作的內涵。
  • 迭代器的方法 也可能是一個更好的方法來實現什麼理解 做。
+3

Comprehensions as數學意義上的集合構建器是Python的一個驚人特性 - 數學語法與python的語法非常接近,因此使用與python相同的語法對於那些語言來說會有多糟糕......它已經發展並經過無數次測試項目。爲什麼重新發明這個強大的工具已經可以工作了...... –