为了账号安全,请及时绑定邮箱和手机立即绑定

有没有一种将数组项转换为对象属性的简写方法?

有没有一种将数组项转换为对象属性的简写方法?

萧十郎 2023-04-14 15:06:11
我一直在阅读 MDN,看到了可以用 rest 和 spread 运算符以及数组解构完成的所有巧妙技巧,现在我想知道是否有一种方法可以快速将数组项映射到命名对象属性。我有一些纯文本制表符分隔值(从电子表格复制),现在我或多或少有这样的东西:const tsv = `1  Jim Robinson    Company Co. Active2   Fred Jimmyson   Examples Inc.   Inactive3   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')}))但它并没有按照我的意愿命名属性,而是仅使用数组索引作为属性名称。
查看完整描述

2 回答

?
慕村9548890

TA贡献1884条经验 获得超4个赞

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



查看完整回答
反对 回复 2023-04-14
?
明月笑刀无情

TA贡献1828条经验 获得超4个赞

您可以reduce()在遍历数组元素时使用填充对象。


reduce()接收数组索引作为第三个参数,这可用于索引属性名称的数组。


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(

  line => line.split(/\s{2,}/)

  .reduce((obj, cur, i) => (obj[properties[i]] = cur, obj), {})

);


console.log(badgeTable);


我复制了@CertainPerformance 的 hack 以在多个空格上拆分输入行。


查看完整回答
反对 回复 2023-04-14
  • 2 回答
  • 0 关注
  • 143 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信