提问人:nb_nb_nb 提问时间:5/15/2023 更新时间:5/16/2023 访问量:58
创建对象的更简洁方式
Neater way to create an object
问:
我正在创建一个具有来自 .有没有更简洁的方法可以做到这一点?object
api 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
答:
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谢谢。我试图做一个衬里
评论
const obj = ["name","val1",..."val6"].reduce((acc,curr)...,{{org:the_org,val7:new_val7}})
result.data.data.table
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})
result.data.data.table