javascript - 是否有一种将数组项转换为对象属性的速记方法?
问题描述
我一直在阅读 MDN 并看到所有可以用其余和传播运算符和数组解构来完成的巧妙技巧,现在我想知道是否有一种方法可以将数组项快速映射到命名对象属性。
我有一些纯文本制表符分隔值(从电子表格复制),现在我或多或少有这样的东西:
const tsv = `1 Jim Robinson Company Co. Active
2 Fred Jimmyson Examples Inc. Inactive
3 Rob Freddison Company Co. Active`;
const badgeTable = tsv.split('\n').map(e => {
let tmp = {};
[ tmp.id, tmp.name, tmp.company, tmp.status ] = e.split('\t')
return tmp
})
基本上,我想知道是否有办法取消tmp
我在 map 函数中使用的变量,并直接将文本拆分为具有属性名称的对象。我尝试使用扩展运算符,如下所示:
const badgeTable = tsv.split('\n').map(e => ({0:id, 1:name, 2:company, 4:status} = {...e.split('\t')}))
但它没有按照我的意愿命名属性,而是使用数组索引作为属性名称。
解决方案
如果您事先创建了一个属性数组,您可以使用Object.fromEntries
将每个拆分项映射到要创建的对象中的一个条目:
const tsv = `1 Jim Robinson Company Co. Active
2 Fred Jimmyson Examples Inc. Inactive
3 Rob Freddison Company Co. Active`;
const properties = ['id', 'name', 'company', 'status'];
const badgeTable = tsv.split('\n').map(
e => Object.fromEntries(
e.split(/\s{2,}/)
.map((value, i) => [properties[i], value])
)
);
console.log(badgeTable);
(我/\s{2,}/
在上面的代码段中拆分只是为了运行代码段,因为 Stack Exchange 将您的选项卡呈现为空格并且选项卡空白存在问题 - 您的原始\t
代码在您的实际代码中可以正常工作)
推荐阅读
- python - 如何在 1 个查询中找到 N 个不同时间和时间戳列之间的最小时间差异
- laravel - 将 Laravel 部署到 Elastic Beanstalk:“无法打开流:权限被拒绝”
- pharo - 无法在 Pharo 中安装“Bloc”包
- javascript - 通过createImageBitmap运行后getImageData不一样
- javascript - 如何根据单个对象属性过滤/排序对象数组
- reactjs - 我在 React Js 中编写代码,但在 localhost 中显示错误,IDK 问题出在哪里
- perforce - 如何知道 perforce retry 真的有效?
- react-native - React-native-fs 对 RN 的对等依赖?
- c++ - Float64 位问题 fir 取消引用类型双关指针将破坏严格别名规则 [-Wstrict-aliasing]
- c++ - GTKmm 进入控制台输出滞后 1 个字符