Может ли оператор switch, содержащий истинные значения, быть записан как поиск литерала объекта? - PullRequest
0 голосов
/ 15 мая 2018

У меня есть следующий код, отображающий изображение на основе значений гаммы гироскопа. Моим первым шагом было написать оператор switch, но я использовал объектные литералы, прежде чем подумать, что это может быть более чистой альтернативой. Есть ли способ сделать это с помощью следующего кода? Или любое другое чистящее средство?

switch (true) {
        case (gamma <= -28):
            view360.goToItem(0);
            break;
        case (gamma <= -24):
            view360.goToItem(1);
            break;
        case (gamma <= -20):
            view360.goToItem(2);
            break;
        case (gamma <= -16):
            view360.goToItem(3);
            break;
        case (gamma <= -12):
            view360.goToItem(4);
            break;
        case (gamma <= -8):
            view360.goToItem(5);
            break;
        case (gamma <= -4):
            view360.goToItem(6);
            break;
        case (gamma <= 0):
            view360.goToItem(7);
            break;
        case (gamma <= 4):
            view360.goToItem(8);
            break;
        case (gamma <= 8):
            view360.goToItem(9);
            break;
        case (gamma <= 12):
            view360.goToItem(10);
            break;
        case (gamma <= 16):
            view360.goToItem(11);
            break;
        case (gamma <= 20):
            view360.goToItem(12);
            break;
        case (gamma <= 24):
            view360.goToItem(13);
            break;
        default:
            view360.goToItem(13);
    }

Ответы [ 3 ]

0 голосов
/ 15 мая 2018

Ваши индексы являются функцией гаммы, поэтому вы должны написать ее как функцию, которая фиксирует эти отношения. Похоже, что отношение просто (28 + gamma) / 4 с дополнительной проверкой гамма больше 60. Поскольку вы используете неравенства для сбора промежуточных значений, вам нужно разделить на 31 и взять слово. Это позволит, например, 3 и 4 вернуть 8. Так что это должно соответствовать вашему switches:

function getIndex(g) {
    return g > 60 ? 13 : Math.floor((31 + g) /  4)
}
view360.goToItem(getIndex(gamma))
0 голосов
/ 15 мая 2018

Не в этом случае, потому что вы используете <= вместо =. Весь ваш метод здесь был бы лучше выражен как if, а else - switch(true) на самом деле не является переключателем.

Вот ключ, который вы можете преобразовать в литерал объекта:

switch ( val ) {
    case 'a': return 'hello';
    case 'b': return 'goodbye';
}

Может быть:

return { a: 'hello', b: 'goodbye' }[ val ];

Поскольку результат вашего переключения (аргумент goToItem) является последовательным (0, 1, 2 ...), вы можете использовать для этого массив.

var gammaValues = [ -28, -24, -20, -16 /* etc */ ];
var idx = gammaValues.findIndex( value => gamma <= value );
if ( index !== -1 ) view360.goToItem( idx );
0 голосов
/ 15 мая 2018

Может быть, использование карты может помочь

const mapBreakpointToItem = {
    -28: 0,
    -24: 1,
    ...
};

Object.keys(mapBreakpointToItem).some((breakpoint) => {
    if (gamma <= breakpoint) {
        const item = mapBreakpointToItem[breakpoint];
        view360.goToItem(item);

        return true;
    }

    return false;
});

Или вы можете использовать math Math.floor ((gamma + 31) / 4 для отображения точек останова и элементов, но если что-то изменить, проще изменить объект карты.

...