Почему JSLint предупреждает меня о неправильном форматировании моего оператора switch-case?

В Adobe Brackets я получаю предупреждения от JSLint при написании строгого кода ['use strict'] о том, что мой оператор switch case имеет неправильный формат:
например. Ожидаемый «регистр» в столбце #, а не в столбце #

Если я перемещаю все внутри оператора switch назад на одну «вкладку», JSLint доволен.
Но Adobe Brackets (и аналогичные приложения с кодом) хочет отступ для операторов case, и даже при использовании Code Beautify он также форматирует код так, чтобы он имел отступ перед оператором case.

  • При использовании строгого кода, действительно ли JSLint предлагает правильный способ форматирования операторов switch-case?
  • Есть ли способ исправить/сделать JSLint в Adobe Brackets, чтобы он считал этот отступ правильным? (Я бы хотел не взламывать код JSLint)
  • Зачем редакторам форматировать оператор switch-case таким образом, если строгий код не хочет, чтобы вы это делали?
  • Я действительно просто делаю что-то не так здесь?
  • Является ли это просто недостатком JSLint, и есть ли способ избежать использования оператора switch-case, а затем вообще, таким образом, в процессе также делая JSLint счастливым?
  • Должен ли я вообще прекратить использовать JSLint? И переключиться на что-то другое?

Этот код вложен в цикл for:

switch (curButton.button.innerText.toLowerCase()) {
    case this.Part1.Button.ButtonText.toLowerCase():
        this.Part1.Button.ButtonText = curButton.button.innerText;
        this.Part1.Button.Element = curButton.button;
        this.Part1.Button.CurrentClass = curButton.button.className;
        console.log(smgData.PodCast.Parts.Part1.Button);
        break;
    case this.Part2.Button.ButtonText.toLowerCase():
        this.Part2.Button.ButtonText = curButton.button.innerText;
        this.Part2.Button.Element = curButton.button;
        this.Part2.Button.CurrentClass = curButton.button.className;
        console.log(smgData.PodCast.Parts.Part2.Button);
        break;
    case this.Part3.Button.ButtonText.toLowerCase():
        this.Part3.Button.ButtonText = curButton.button.innerText;
        this.Part3.Button.Element = curButton.button;
        this.Part2.Button.CurrentClass = curButton.button.className;
        console.log(smgData.PodCast.Parts.Part3.Button);
        break;
}

Вот базовый код, который будет воспроизводить это на https://www.jslint.com/.

function abcd() {
    var a;
    var b;
    switch (a) {
        case 1:
            a=b;
            break;
        case 2:
            b=a;
            break;
    }
}

Предупреждения JSLint


person AJ Smith 'Smugger'    schedule 02.11.2019    source источник
comment
Я не могу воспроизвести это, скопировав ваш код в онлайн-линтер. Я настоятельно рекомендую вместо этого использовать более активный современный линтер, такой как ESLint, хотя JSLint... довольно не хватает IMO   -  person CertainPerformance    schedule 03.11.2019
comment
Тем не менее, часто полезно полностью избегать switch. Здесь вы можете избежать этого и сделать код намного короче, используя скобки, но это не похоже на решение, о котором вы просите.   -  person CertainPerformance    schedule 03.11.2019
comment
Я был бы готов переформатировать вопрос, чтобы задать другой способ написания этого кода. Если у вас есть предложение о лучшем способе избежать использования оператора switch, я готов это знать.   -  person AJ Smith 'Smugger'    schedule 03.11.2019
comment
И ESLint также встроен в Adobe Brackets, наверное, я просто пытался осчастливить их обоих.   -  person AJ Smith 'Smugger'    schedule 03.11.2019
comment
smgData.PodCast.Parts совпадает с this? Мне интересно, можно ли, например, console.log(smgData.PodCast.Parts.Part1.Button); превратить в console.log(this.Part1.Button);   -  person CertainPerformance    schedule 03.11.2019
comment
Я добавил в вопрос некоторый код, который будет воспроизводить это на веб-сайте jslint, и... Да, я мог бы использовать this.Part1.Button, но я называю это так только для отладки, я не оставляю там console.log.   -  person AJ Smith 'Smugger'    schedule 03.11.2019


Ответы (1)


Это похоже на проблему с JSLint.

Это не совсем то, о чем вы спрашивали, но один из способов переформулировать код и полностью избежать switch (и, следовательно, проблем JSLint с switch) - это .find Part, ButtonText которого соответствует. Затем используйте скобки, чтобы найти кнопку на this:

const currentText = curButton.button.innerText.toLowerCase();
const matchingPart = ['Part1', 'Part2', 'Part3']
    .find(part => currentText === this[part].Button.ButtonText.toLowerCase());
if (matchingPart) {
    const { button } = this[matchingPart];
    button.ButtonText = curButton.button.innerText;
    button.Element = curButton.button;
    button.CurrentClass = curButton.button.className;
    console.log(smgData.PodCast.Parts[matchingPart].Button);
}

Если вы можете контролировать форму объекта this, вероятно, было бы проще, если бы Part были массивом, а не тремя разными свойствами. Затем вы могли бы .find работать с этим массивом вместо того, чтобы жестко кодировать 3 свойства Part.

Я бы посчитал приведенный выше код совершенно хорошим, но чтобы он соответствовал всем правилам JSLint (IMO - самоуверенный и не очень хороший), он должен быть

const currentText = curButton.button.innerText.toLowerCase();
const props = ["Part1", "Part2", "Part3"];
const matchingPart = props.find(function(part) {
    return currentText === this[part].Button.ButtonText.toLowerCase();
});
if (matchingPart) {
    const { button } = this[matchingPart];
    button.ButtonText = curButton.button.innerText;
    button.Element = curButton.button;
    button.CurrentClass = curButton.button.className;
    console.log(smgData.PodCast.Parts[matchingPart].Button);
}
person CertainPerformance    schedule 02.11.2019
comment
Вы случайно не знаете, почему JSLint не любит присваивание =>? - person AJ Smith 'Smugger'; 03.11.2019
comment
По какой-то причине JSLint предпочитает более подробный function, когда функция занимает несколько строк (что нужно было сделать, потому что JSLint не понравилось количество символов в строке, а также не понравилось, что .find находится на новой строке). ). Это довольно глупые правила, IMO - если только все, что обеспечивает JSLint, не является тем, что вы на самом деле хотите, на вашем месте я бы вместо этого подумал об использовании ESLint. - person CertainPerformance; 03.11.2019
comment
Итак, повозившись с обоими предоставленными вами примерами кода, второй вариант сделает JSLint довольно счастливым, но я должен был заметить, что вы предоставили функцию во втором примере, и JSLint это не нравится, Don't make function within a loop. }); - person AJ Smith 'Smugger'; 03.11.2019
comment
Я не вижу здесь цикла, весь этот сегмент кода внутри цикла? Если это так, вероятно, было бы неплохо выделить его в отдельную функцию (возможно, с именем setMatchingButton), а затем вызывать эту функцию на каждой итерации. - person CertainPerformance; 03.11.2019
comment
Я собираюсь просто проигнорировать весь JSLint и просто сосредоточиться на ESLint, если он по-прежнему будет слишком сложным, просто чтобы сделать JSLint счастливым. Нет причин, по которым мне нужен чистый код JSLint. Я больше искал понимания и видел, смогу ли я это сделать. Личные амбиции, наверное. ;) - person AJ Smith 'Smugger'; 03.11.2019
comment
Итак, перенос сопоставления на новую функцию — это способ обойти это предупреждение, вау. Хорошая идея. Я должен был упомянуть об этом. Я просто пытался показать как можно меньше кода. - person AJ Smith 'Smugger'; 03.11.2019
comment
Я собираюсь принять это как общее решение, я перехожу на использование в первую очередь только ESLint, вместо того, чтобы идти в ногу с JSLint, как вы выразились, упрямые ответы, я также установил JSHint, и это кажется намного лучше. Хотя я не мог заставить JSLint в Brackets принимать const, но на сайте jslint нет предупреждений об использовании const. Поэтому я предполагаю, что это проблема с JSLint в скобках. Не могли бы вы указать, что использование ESLint, вероятно, является лучшим способом, и прекратить использование JSLint в ответе где-нибудь. - person AJ Smith 'Smugger'; 03.11.2019
comment
Я даже обновил вопрос, чтобы он соответствовал вашему ответу, даже предложив отказаться от JSLint. - person AJ Smith 'Smugger'; 03.11.2019