Есть ли идиоматический c Javascript способ избежать предоставления значения по умолчанию для ошибочного `Array.find ()`? - PullRequest
1 голос
/ 13 января 2020

У меня есть рабочий код для создания объекта на лету:

// 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 с неопределенным результатом (когда в отделах нет соответствующего элемента) неловко.

Есть ли какой-то идиоматический c способ сделать это, которого мне не хватает?

Ответы [ 2 ]

2 голосов
/ 13 января 2020

В ES6 должно быть что-то вроде этого

const dept = {
    code: reviewer.replace(/[ ]/g, '_').replace(/[/W]/g, ''),
    ...departments.find( dept => dept.title === reviewer) 
}
0 голосов
/ 13 января 2020

Если вы не возражаете против использования внешней библиотеки get() от loda sh, это не позволит вам создавать ненужные объекты и в то же время поможет вам с проверкой свойств:

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] = {}

в противном случае вы можете использовать оператор распространения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...