【发布时间】:2016-03-22 05:43:11
【问题描述】:
我正在读取一个带有制表符分隔值的文件,我想将其转换为一个具有命名属性的哈希数组。
我研究过the MDN page on Destructuring assignment,但其中一些涉及更多的示例对我来说没有意义,而且我没有看到导致单个对象的语法。
这是我目前所得到的:
return File.readFile(filepath, 'utf8')
.then((fileContents) => fileContents.split('\n').map((line) => {
// here is where I'd convert the line of tab-separated
// text into an object with named properties
// this is fake, broken syntax
return ({ prop_a: [0], prop_b: [2], prop_c: [1] }) = line.split('\t');
}));
需要注意的几点:
- 我正在使用带有节点 v5 的 babel。如有必要,我愿意加载额外的解析或转换插件。
-
File.readFile是一个简单的 ES6 Promise 包装器,围绕节点原生fs.readFile(path, opt, callback)API。
我正在寻找一个可以拆分line 并从中任意分配到新创建的对象的语句。我认为解构是实现这一目标的正确方法,但也许需要的是例如休息或传播的一些创造性使用。
// sample input text
Ralphette dog 7
Felix cat 5
// desired output
[ { name: 'Ralphette', species: 'dog', age: '7' },
{ name: 'Felix' , species: 'cat', age: '5' }
]
感谢您的帮助!
回答
听起来没有办法仅通过解构来做到这一点。然而,在混合中引入 IIFE 会产生一种具有较少异国情调的解构的单线。这是我使用的代码,基于@Amadan 的回答:
return File.readFile(filepath, 'utf8')
.then((fileContents) => (fileContents.length === 0)
? []
: fileContents
.split('\n')
.map((line) => (([ name, species, age ]) => ({ name, species, age }))(line.split('\t')))
)
它非常简洁,因此我建议不要在实际项目中使用它。
如果几年后,有人发现了一种无需 IIFE 的方法,我希望他们会发布它。
【问题讨论】:
-
顾名思义,你不能用destructuring来construct一个对象。解构是关于从集合中提取数据,而不是创建集合。为此使用对象或数组字面量。
-
@Tom,我提供了更新我的答案以解决您的 IIFE 评论