【问题标题】:Is there an idiomatic Javascript way of avoiding providing a default value for a failing `Array.find()`?是否有一种惯用的 Javascript 方法可以避免为失败的 `Array.find()` 提供默认值?
【发布时间】: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.code calc 将失败。我想要为所有传入元素创建一个属性,但缩短我已经知道的项目的名称。

标签: javascript arrays idioms


【解决方案1】:

在 ES6 中应该是这样的

const dept = {
    code: reviewer.replace(/[ ]/g, '_').replace(/[/W]/g, ''),
    ...departments.find( dept => dept.title === reviewer) 
}

【讨论】:

  • 天啊!是的,看起来确实更好 - 并避免了“伊斯坦布尔”工具的覆盖问题
【解决方案2】:

如果您不介意使用来自 lodash 的外部库 get() 会阻止您创建不必要的对象,同时会在属性验证方面为您提供很多帮助:

const { get } = require('lodash')

const backupCode = reviewer.replace(/[ ]/g, '_').replace(/[/W]/g, '').toLowerCase() + '_reviewer';
const key = get(departments.find( dept => dept.title === reviewer), 'code', backupCode)

validationObject[key] = {}

否则你可以使用扩展运算符。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-26
    • 1970-01-01
    • 1970-01-01
    • 2019-12-09
    • 2014-11-03
    • 1970-01-01
    • 1970-01-01
    • 2017-02-20
    相关资源
    最近更新 更多