предисловие
Как рабочий нижнего уровня, который перемещает кирпичи на передовой, бизнес-сценарий никогда не был невозможным, только неожиданно сложным.
Но он силен и он силен, если-иначе все сделано, и ход окончен. Но при бизнес-итерации или передаче проекта, когда я смотрю на свой или чужой код if, мое настроение уже не выражается, и у каждого возникает глубокое понимание. Итак, давайте посмотрим, как еще написать, если
Самый простой if-else
Предположим, есть сценарий, в котором в разных ситуациях печатаются разные значения. Поскольку задействовано слишком много условий, оптимизации, такие как троичные операции, не упоминаются.
if (a == 1) {
console.log('a1')
} else if (a == 2) {
console.log('b2')
} else if (a == 3) {
console.log('c3')
} else if (a == 4) {
console.log('d4')
}
/* n..... */
Это все еще можно увидеть сейчас, потому что логика проста, если логика сложна, после повторения нескольких версий вы бы осмелились двигаться?
Я дрожу каждый раз, когда двигаюсь, кто знает, где я это пропущу.
Так как насчет другого пути?
switch-case
Это немного яснее, и разница, похоже, не имеет никакого значения:
switch(a){
case 1:
console.log('a1');
break;
/* 省略。。。 */
case 40:
console.log('a40');
break;
}
Отделение информации о конфигурации от действий по выполнению
сопоставление объектов
Определите объект как объект конфигурации для хранения различных состояний и поиска в связанном списке.
const statusMap = {
1:()=>{
console.log('a1')
},
2:()=>{
console.log('b2')
}
/* n.... */
}
// 执行
let a = 1
statusMap[a || 1]()
Это понятнее и отделяет условную конфигурацию от конкретного выполнения. Если вы хотите добавить другие состояния, просто измените объект конфигурации.
карта массива
Конечно, в некоторых состояниях можно использовать массив для создания этого объекта конфигурации.
// 这里就涉及其他优化了,例如将执行函数抽离出来,大家不要关注func的内容就好。
// 它就是个function,内容很复杂
const statusArr = [function(){
console.log(1)
},
function () {
console.log(2)
},]
// 执行
let a = 1
statusArr[a || 1]()
Требования к массиву выше, если это другие ключи, например строки, то массив не может соответствовать требованиям.
Обновленная версия: одинаковое значение для разных ключей
Это выглядит немного лучше, потом спрос снова изменился,
Спереди то, что каждый метод обработки отличается.Есть несколько случаев, когда функция обработки одинакова.
Например, когда 1-39, вызовите a, вызовите b после 40, если мы продолжим использовать метод сопоставления для обработки.
function f1 (){
console.log(1)
}
function f2 (){
console.log(2)
}
const statusMap={
1:f1,
2:f1,
3:f1,
4:f1,
//省略
40:f2
}
let a = 2
statusMap[a]()
Конечно, это тоже возможно, но постоянное написание такого количества f1 делает код менее кратким.
Прежде чем приступить к рефакторингу, давайте взглянем на наши идеи: мы просто хотим объединить несколько ключей, чтобы они соответствовали одному значению.
То есть наше ключевое значение — это не строка, а массив, Object, очевидно, поддерживает только строки.
Затем вы можете объединить столько ключей в один: «1,2,3,4,..,9».
Но есть проблема с поиском, и наши параметры не должны точно совпадать.
Затем продолжайте делать обход и суждение, все включенные в подмножество считаются соответствующими, тогда код выглядит следующим образом.
// 将键值key设置为一个拼接之后的字符串
const statusMap = {
'1,2,3,4,5': f1,
//省略
40: f2
}
// 获取所有的键值,待会遍历用
const keys = Object.keys(statusMap),
len = keys.length
// 遍历获取对应的值
const getVal=(param='')=>{
// 用for循环的原因在于匹配之后就不需要继续遍历
for (let i = 0; i < len; i++) {
const key = keys[i],
val = statusMap[key]
// 这里用什么来判断就随便了,两个字符串都有。
if (key.includes(param)) {
return val
}
}
}
let a = 2,
handle = getVal(a)
handle() // 1
Но таким образом добавляется процесс обхода, а это склейка строки.Если запятая будет пройдена за один день, то будут получены неожиданные результаты.
map
ES6 имеет новую структуру данных Map, которая поддерживает произвольные структуры данных в качестве ключей. Это может быть яснее, если вы используете Map.
/**
* map键值索引的是引用地址,
* 如果是下面这样的写法不好意思,永远得不到值
* map1.set([1,4,5],'引用地址')
* map1.get([1,4,5]) //输出为undefined
* 就像直接访问
* map1.get([1,2,3,4,5]) //同样为undefined
*/
const map1 = new Map()
const statusArr = [1,2,3,4,5]
map1.set(statusArr,f1)
// 预设默认值,因为不能直接遍历
let handle = function(){}
const getVal = (param = '') => {
for (let value of map1.entries()) {
console.log(JSON.stringify(value))
if (value[0].includes(param)){
console.log(value)
// 不能跳出 只能处理了
handle = value[1]
}
}
}
const a = 2
getVal(a)
handle()
На мой взгляд, хотя это и сокращает повторяющийся код, но добавляет еще один этап сопоставления значения.
двойной массив
Конечно, некоторые люди просто не хотят делать операцию по перемещению, поскольку массив не выполнен, то две массивы этого.
// 键值数组和value 保持对应关系
const keyArr = ['1,2,3,4,5','40']
const valArr = [f1,f2]
const getVal = (param = '')=>{
// 查找参数对应的下标
let index = keyArr.findIndex((it)=>{
return it.includes(param)
})
// 获取对应值
return valArr[index]
}
let a = 2,
handle = getVal(a)
handle()
Используйте нижний индекс, предоставленный массивом, чтобы сопоставить ключ и значение, чтобы получить желаемое значение.
Моя первоначальная цель здесь не достигнута, то есть повторяющийся массив в ключе может быть сопоставлен без избыточных операций, а вышеперечисленное было обработано несмотря ни на что, это не то, что нужно ленивым людям.
Суммировать
Это небольшое резюме при написании бизнес-требований.Отображение массивов и объектов может быть использовано всеми. Столкнувшись с ситуацией, когда разные ключи имеют одинаковое значение, начинать с лени — это не то же самое, что повторять список, так что попробуйте. Конечно, из-за проблем на личном уровне должен быть лучший способ справиться с ними Добро пожаловать, чтобы обсудить вместе и добиться прогресса вместе. Кроме того, существующая зрелая библиотека loadsh также может достичь цели, но, подумав об этом самостоятельно, вы получите более глубокое понимание дел Божьих.Для получения дополнительных статей, пожалуйста, перейдите в мой блог