Как мы можем кодировать нечувствительный к регистру код в JavaScript?

В моем проекте мне нужно позаботиться о нечувствительности к регистру, и я не знаю, как я могу написать что-то подобное в JavaScript.

Если я пишу на своем терминале, мне нужно, чтобы мой код понимал то же самое:

`BOB
bob 
Bob`

Мой код:

       #!/usr/bin/env node

let chunk = "";

process.stdin.on("data", data => {
    chunk += data.toString();
});

process.stdin.on("end", () => {
    chunk.replace(/^\s*[\r\n]/gm,"").split(/\s+/).ignoreCase.forEach(function (s) {
        process.stdout.write(
        s === 'bob'
        ? 'boy \n'
        : s === 'alicia'
           ? 'girl\n'
           : s === 'cookie'
               ? 'dog \n'
               : 'unknown \n');
    });
});

Результат, который мне нужно отобразить:

`boy
boy
boy`

Я пытался сделать это с помощью ignoreCase, но это не работает, можете ли вы объяснить мне, почему?


person Shirley Truffier-Blanc    schedule 09.10.2018    source источник
comment
Измените ввод на нижний регистр с помощью метода toLowerCase   -  person Sorikairo    schedule 09.10.2018
comment
.ignoreCase не работает, потому что такого нет; ты только что придумал? Вы можете преобразовать строки в верхний или нижний регистр и после этого сравнить.   -  person Pointy    schedule 09.10.2018
comment
Ваш одноклассник сначала спросил здесь stackoverflow.com/questions/52724411/ 8)   -  person choz    schedule 09.10.2018
comment
@Pointy Нет, я не изобретаю это, я видел это на курсах, так что не могли бы вы мне помочь, пожалуйста?   -  person Shirley Truffier-Blanc    schedule 09.10.2018
comment
@Sorikairo toUpperCase рекомендуется   -  person mplungjan    schedule 09.10.2018
comment
ignoreCase – это метод Регулярных выражений. Вы не можете применить его к коллекциям строк, которые вы повторяете.   -  person meagar    schedule 09.10.2018
comment
@mplungjan Я хотел бы услышать об этом больше, если вы не возражаете?   -  person Sorikairo    schedule 09.10.2018
comment
@ShirleyTruffier-Blanc .ignoreCase, скорее всего, это пользовательская функция, которую вы видели, а не встроенная функция.   -  person Scott Marcus    schedule 09.10.2018
comment
документы. microsoft.com/en-gb/visualstudio/code-quality/   -  person mplungjan    schedule 09.10.2018
comment
У вас действительно есть обратные кавычки вокруг ввода и вывода?   -  person Barmar    schedule 09.10.2018


Ответы (3)


Просто используйте String.prototype.toLowerCase для всех ваших строки на входе, чтобы при их сравнении был только один способ их представления.

process.stdin.on("data", data => {
  chunk += data.toString().toLowerCase();
});
person zfrisch    schedule 09.10.2018
comment
рекомендуется toUpperCase - person mplungjan; 09.10.2018
comment
@mplungjan почему? - person zfrisch; 09.10.2018
comment
@mplungjan есть ли странные угловые регистры Unicode, которые делают преобразование в верхний регистр более надежным? - person Pointy; 09.10.2018
comment
Спасибо @zfrisch за ответ - person Shirley Truffier-Blanc; 09.10.2018
comment
ответьте здесь, возможно (?) Это касается интернационализации, но как бы отвечает на вопрос, почему, в частности, на второй комментарий к исходному вопросу о персонажах, совершающих кругосветное путешествие. - person mhodges; 09.10.2018
comment
@mhodges спасибо! Это ДЕЙСТВИТЕЛЬНО похоже на чертову микрооптимизацию, но я посмотрю! - person zfrisch; 09.10.2018
comment
@zfrisch Однако без интернационализации toLowerCase почти всегда будет более эффективным, поскольку большая часть текста написана в нижнем регистре (меньше преобразований символов). Подробнее об этом здесь - person mhodges; 09.10.2018
comment
comment
@mplungjan Это только при сравнении интернационализации и локали. В общем, большинство сравнений строк более производительны с .toLowerCase() по причине, которую я указал выше. - person mhodges; 09.10.2018
comment
Предполагая, что это проблема. - person mplungjan; 09.10.2018

Просто возьмите ввод и переведите его в нижний или верхний регистр с помощью String.toLowerCase() или String.toUpperCase(), а затем сравните его с той же строкой в ​​регистре:

console.log("test" === "Test"); // false
console.log("test" === "Test".toLowerCase()); // true
console.log("TeSt".toUpperCase() === "Test".toUpperCase()); // true

person Scott Marcus    schedule 09.10.2018
comment
рекомендуется toUpperCase - person mplungjan; 09.10.2018
comment
@mplungjan Почему? Я был в мире JS более 20 лет и никогда не слышал об этом. Все, что имеет значение, это то, что строки должны быть одного и того же регистра — неважно, верхний он или нижний. - person Scott Marcus; 09.10.2018
comment
@mplungjan и кем это рекомендуется? - person Pointy; 09.10.2018
comment
ответьте здесь, возможно (?) Это касается интернационализации, но как бы отвечает на вопрос, почему, в частности, на второй комментарий к исходному вопросу о персонажах, совершающих кругосветное путешествие. - person mhodges; 09.10.2018
comment
@ScottMarcus, конечно же, вы можете написать быстрый тест, используя .fromCharCode(), чтобы попробовать все 16-битные кодовые точки, и некоторые из них не переходят в нижний регистр и обратно в верхний регистр. Это новость для меня. - person Pointy; 09.10.2018
comment
@zfrisch это просто простой цикл for от 0 до 65535 (вероятно, должен остановиться до этого), вызывающий String.fromCharCode() и проверяющий, приводит ли переход к нижнему регистру и обратно к верхнему регистру к той же строке, что и прямой переход к верхнему регистру. - person Pointy; 09.10.2018
comment
@Pointy о, я вижу! Я построю это и проверю для себя. Выглядит очень странно, но интересная тема для обсуждения. - person zfrisch; 09.10.2018
comment
@Pointy Спасибо. Узнавайте что-то новое каждый день! - person Scott Marcus; 09.10.2018

Свойство RegExp.prototype.ignorecase содержит логическое значение, указывающее, установлен ли флаг "i" для регулярного выражения. Это не функция и не предоставляет никаких операций над выражением или строкой.

См.: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/ignoreCase

Возможно, вы захотите рассмотреть возможность вызова чего-то вроде функции String.prototype.toLowerCase(), которая преобразует строку в нижний регистр.

Редактировать: если это поможет, я думаю, вы могли бы поместить toLowerCase() перед split(), поскольку toLowerCase() - это функция String, а не функция массива. И если вы не хотите позже вызывать его отдельно для каждой строки, может быть быстрее всего сделать это в одном месте, примерно так:

chunk.replace(/^\s*[\r\n]/gm,"").toLowerCase().split(/\s+/).forEach(function (s) {
   // function here
});
person Neely    schedule 09.10.2018