创建对象的更简洁方式

Neater way to create an object

提问人:nb_nb_nb 提问时间:5/15/2023 更新时间:5/16/2023 访问量:58

问:

我正在创建一个具有来自 .有没有更简洁的方法可以做到这一点?objectapi response

我的代码:

const variables = {
    name: result.data.data.table.name,
    org: the_org,
    val1: result.data.data.table.val1,
    val2: result.data.data.table.val2,
    val3: result.data.data.table.val3,
    val4: result.data.data.table.val4,
    val5: result.data.data.table.val5,
    val6: result.data.data.table.val6,
    val7: new_vals7,
  };

有些值来自 an,有些则不是。只是想知道有没有一种更简洁的方法可以做到这一点?api call

JavaScript 对象 ecmascript-6 属性 键值

评论

0赞 cmgchess 5/15/2023
保留名称,val1,...val6 并循环它并添加到对象中。val7 和 org 你将不得不手动const obj = ["name","val1",..."val6"].reduce((acc,curr)...,{{org:the_org,val7:new_val7}})
0赞 Andy 5/15/2023
这些是唯一的属性还是更多?result.data.data.table
0赞 nb_nb_nb 5/15/2023
@Andy还有更多
1赞 cmgchess 5/15/2023
@nb_nb_nb这就是我的意思const variables = ['name', 'val1','val2', 'val3', 'val4', 'val5', 'val6'].reduce((acc,curr) => ({...acc,[curr]:result.data.data.table[curr]}),{org:the_org,val7:new_vals7})
1赞 Reyno 5/15/2023
您可以扩散到新对象中。result.data.data.table

答:

1赞 Alexander Nenashev 5/15/2023 #1

如果您需要响应中的所有数据并覆盖其中的一些值,这可能看起来不错:

const variables = {...result.data.data.table, org: the_org, val7: new_vals7};

如果只需要特定值:

    const result={
      data:{
        data:{
          table:{
            name:'name', 
            ...Object.fromEntries([...new Array(6)].map((_,idx)=>'val' + (idx + 1)).map(v => [v, v]))
          }
        }
      }
    };

    // this you need
    const variables = {
        ...Object.fromEntries(
            Object.entries(result.data.data.table)
                .filter(([key]) => /^(val[1-6]|name)$/.test(key))), 
        org: 'the_org', 
        val7: 'new_vals7'
    };

    console.log(variables);

2赞 Andrew Parks 5/15/2023 #2

您可以使用 spread 运算符来包含来自另一个对象的额外条目。Object.fromEntries 通过从数字 1 到 6 映射到结果中表对象的属性来生成该对象。

const result = {
  data: {
    data: {
      table: {
        name: 'name',
        val1: 'val1',
        val2: 'val2',
        val3: 'val3',
        val4: 'val4',
        val5: 'val5',
        val6: 'val6'
      }
    }
  }
}

const the_org = 'the_org'
const new_vals7 = 'new_vals7'

const table = result.data.data.table;
const variables = {
    name: table.name,
    org: the_org,
    ...Object.fromEntries(Array.from({length: 6}, (_,i)=>`val${i+1}`)
      .map(p=>[p, table[p]])),
    val7: new_vals7,
};

console.log(variables);

评论

0赞 Alexander Nenashev 5/15/2023
caught TypeError:迭代器值 val1 不是入口对象
0赞 Andrew Parks 5/16/2023
@silentmantra啊,谢谢,括号放错了地方。现在有效
1赞 cmgchess 5/15/2023 #3

您可以尝试通过保留要提取的字段列表来使用。对于累加器,您可以传递一个对象以及其余属性reduce

const the_org = 'the_org'  
const new_vals7 = 'new_vals7'
const result = {
  data: {
    data: {
      table: {
        name: 'name',
        val1: 'val1',
        val2: 'val2',
        val3: 'val3',
        val4: 'val4',
        val5: 'val5',
        val6: 'val6'
      }
    }
  }
}

const variables = ['name', 'val1','val2', 'val3', 'val4', 'val5', 'val6']
.reduce((acc,curr) => ({...acc,[curr]:result.data.data.table[curr]}),{org:the_org,val7:new_vals7})

console.log(variables)

正如 Andy 在评论中提到的,在每次迭代中创建一个新对象可能效率低下。您可以通过删除传播语法来避免这种情况。

const the_org = 'the_org'  
const new_vals7 = 'new_vals7'
const result = {
  data: {
    data: {
      table: {
        name: 'name',
        val1: 'val1',
        val2: 'val2',
        val3: 'val3',
        val4: 'val4',
        val5: 'val5',
        val6: 'val6'
      }
    }
  }
}

const variables = ['name', 'val1','val2', 'val3', 'val4', 'val5', 'val6']
.reduce((acc, curr) => {
  acc[curr] = result.data.data.table[curr]
  return acc
}, { org: the_org, val7: new_vals7 })

console.log(variables)

评论

0赞 Andy 5/15/2023
在每次迭代中创建一个全新的对象并不是特别有效。
1赞 cmgchess 5/15/2023
@Andy谢谢。我试图做一个衬里