На самом деле, мы можем написать меньше if else и переключиться

JavaScript

предисловие

Как рабочий нижнего уровня, который перемещает кирпичи на передовой, бизнес-сценарий никогда не был невозможным, только неожиданно сложным.
Но он силен и он силен, если-иначе все сделано, и ход окончен. Но при бизнес-итерации или передаче проекта, когда я смотрю на свой или чужой код 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 также может достичь цели, но, подумав об этом самостоятельно, вы получите более глубокое понимание дел Божьих.Для получения дополнительных статей, пожалуйста, перейдите в мой блог