Как выполнить поиск без учета регистра в наборе JavaScript? - PullRequest
1 голос
/ 01 апреля 2019

Как выполнить поиск без учета регистра в javascript set?

У меня есть ситуация, когда у меня есть набор разрешенных строк, который не гарантирует, в каком случае они будут. Мне нужно проверитьпользовательский ввод против этого набора.Как мне этого добиться?

const countries = new Set();
countries.add("USA");
countries.add("japan");

// returns false, but is there any way I could get 
//`my set to ignore case and return true?`
console.log(countries.has("usa")); 

console.log(countries.has("USA"));

Ответы [ 4 ]

4 голосов
/ 01 апреля 2019

Просто всегда вызывайте .toLowerCase в строке перед добавлением или перед проверкой .has.Конечно, вы также можете абстрагировать это в класс (если это действительно необходимо):

 class CaseInsensitiveSet extends Set {
   constructor(values) {
     super(Array.from(values, it => it.toLowerCase()));
   }

   add(str) {
     return super.add(str.toLowerCase());
   }

   has(str) {
     return super.has(str.toLowerCase());
   }

   delete(str) {
     return super.delete(str.toLowerCase());
   }
}

const countries = new CaseInsensitiveSet([
  "Usa",
]);

console.log(countries.has("usa")); // true
0 голосов
/ 01 апреля 2019

Вы можете добавить прототип hasIgnoreCase() на Set.

Set.prototype.hasIgnoreCase = function(str) {
  return this.has(str) || this.has(str.toUpperCase());
}

const countries = new Set();
countries.add("USA");
countries.add("japan");



// returns false, but is there any way I could get 
//`my set to ignore case and return true?`
console.log(countries.hasIgnoreCase("usa"));

console.log(countries.hasIgnoreCase("USA"));
0 голосов
/ 01 апреля 2019

Наборы проверяют точные данные, которые вы предоставили. Самое простое решение - сохранить данные в нижнем регистре или в верхнем регистре, а затем выполнить поиск по набору, используя метод .toLoserCase() String.

Пример:

// Save data in lowecase
const set1 = new Set(['test', 'other']);

console.log(set1.has('Test'));
// expected output: false

console.log(set1.has('Other'.toLowerCase()));
// expected output: false
0 голосов
/ 01 апреля 2019

Краткий ответ - «нет».has использует алгоритм SameValueZero для поиска существования значения.См. Таблицу сравнения здесь .

Если производительность не имеет значения, вы можете попробовать два поиска, один с верхним регистром, а другой с нижним регистром, и решить, существует ли значение на самом деле.

И лучшим подходом будет всегда вставлять значения путем преобразования их в верхний / нижний регистр и соответствующего соответствия для существования.

...