首页 > 解决方案 > 是否有一种将数组项转换为对象属性的速记方法?

问题描述

我一直在阅读 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')}))

但它没有按照我的意愿命名属性,而是使用数组索引作为属性名称。

标签: javascriptecmascript-6

解决方案


如果您事先创建了一个属性数组,您可以使用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代码在您的实际代码中可以正常工作)


推荐阅读