【发布时间】:2020-04-30 05:35:38
【问题描述】:
我有用于动态创建对象的工作代码:
// dummy sources
const departments = [
{ code: 'DA', title: 'Department A' },
{ code: 'DB', title: 'Department B' },
{ code: 'DC', title: 'Department C' },
{ code: 'DD', title: 'Department D' },
]
const reviewers = ['Department A','Pub Lunches','Department C','Department D']
const validationObject = {}
// actual code
reviewers.forEach( (reviewer, index) => {
const dept = departments.find( dept => dept.title === reviewer) || { code: reviewer.replace(/[ ]/g, '_').replace(/[/W]/g, '') }
validationObject[dept.code.toLowerCase()+'_reviewer'] = {blah:'blah'}
})
console.log(validationObject)
它有效,但是在抓取未定义结果的code 元素时(当部门中没有匹配元素时)创建一个虚拟对象只是为了克服错误看起来很尴尬。
有没有我想念的更惯用的方法?
【问题讨论】:
-
我认为您的代码看起来不错。你可以为这个功能准备一些函数(虚拟代码和
dept.code.toLowerCase()+'_reviewer',这会让它有点花哨。但总体思路还可以。 -
我在您的问题中不清楚的地方-您的代码为不在部门中的审阅者提供了替代值,这将导致类似
Pub_Lunches,但您的问题是您正在创建虚拟对象只是为了克服错误。您要保留该 Pub_Lunches 项目还是忽略它?如果是后者,那么向 validationObject 添加内容的位应包含在if (dept && dept.code) { /*etc*/ } -
如果我不添加
{ code: 'Pub_Lunches' }对象生成,那么下一行中的dept.codecalc 将失败。我想要为所有传入元素创建一个属性,但缩短我已经知道的项目的名称。
标签: javascript arrays idioms