Сравнение попытки обхода со строковым javascript

#javascript #node.js #discord #discord.js

#javascript #node.js #Discord #discord.js

Вопрос:

Из названия вопроса это может показаться легкой задачей, но я новичок. Что мне нужно сделать, это сравнить строку (пользовательский ввод, у меня он уже есть) со списком слов. В принципе, если пользователь вводит bluuexel, я все еще хочу, чтобы программа интерпретировала его как синий (на самом деле я создаю бота для цензуры слов, и просто ввод случайных данных является обычной стратегией обхода цензуры).). Я собирался отсортировать и удалить дубликаты, но потом понял, что «ass» станет «as», и эта стратегия не будет столь применима.

Комментарии:

1. Вы вряд ли получите удовлетворительный ответ на вопрос, потому что он сложный и по большей части не относится к домену JS, а также недостаточно специфичен. Возможно, вы захотите сначала узнать о NLP и нормализации. Но почему предполагается, что он связывает blue и bluuexel? Они даже отдаленно не похожи, кроме blu-части. as и ass гораздо более похожи как для человека, так и для машины. Попробуйте какую-нибудь библиотеку сравнения на основе оценки, например, string-similarity, возможно, результат вас устроит.

2. @EstusFlask Я не думал о том, как плакат может рассматривать обработку NLP, но тем не менее. Я подумал, что это связано с анализом подстрок, так что, возможно, это была некоторая помощь или руководство. Отличный комментарий с вашей стороны.

Ответ №1:

Для анализа строк вы можете использовать String.prototype.includes , чтобы увидеть, находится ли подстрока в строке, или другие параметры, такие как регулярное выражение, для точного совпадения. Может быть применено много подходов, но этот пример поможет вам начать. String.prototype.includes

Для замены других строк вам понадобится что-то вроде String.prototype.replace . String.prototype.replace

Поскольку вы также отметили этот пост в Node.js для получения пользовательского ввода из командной строки. Использование может использовать Node.js модуль readline. Строка чтения

Остерегайтесь сравнения item.value == search , которое также может привести к неожиданному принудительному вводу типа. Вот почему мы используем ==== .

Примечание

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

 var items = [{
    value: "one"
  },
  {
    value: "bluuexel"
  }
]

// Accept a search string term variable
unique = (search) => {
  // Iterate through the object items
  // Some: Determines whether the specified callback function
  // returns true for any element of an array.
  return items.some(item => {
    // Return if item.value is equal to the search string, beware of 
    // Comparison item.value == search may cause unexpected type 
    // coercion. So we use ===
    return item.value === search
  });
};

// Accept a search string term variable
contains = (search) => {
  // Iterate through the object items
  // Some: Determines whether the specified callback function
  // returns true for any element of an array.
  return items.some(item => {
    // Includes: Returns true if searchString
    // appears as a substring of the result of converting
    // this object to a String, at one or more positions that
    // are greater than or equal to position; otherwise, returns false.
    // Return if item.value contains equal to the search string
    return item.value.includes(search)
  });
};

console.log('Unique:', unique('bluuexel'), '=> bluuexel');
console.log('Contains:', contains('bluu'), '=> bluu');
console.log('Contains:', contains('bluu2'), '=> bluu2');
console.log('Unique:', unique('one'), '=> one');
console.log('Unique:', unique('one2'), '=> one2');  

Теперь для удаления слов из массива или дубликатов, также много других подходов. Но вот простой пример.

Мы также используем Spread syntax (...) , позволяющее в короткие сроки расширять итерацию, такую как выражение массива или строка. Распространение

Set Конструктор позволяет создавать объекты Set, которые хранят уникальные значения любого типа, будь то примитивные значения или ссылки на объекты. Set

 // Defined list of an array of words
let words = ['bluuexel', 'bluuexel2', 'bluuexel'];
// ... Spread operator to iterate over array elements in array "words"
console.log('Removed (Duplicates)', words);
let removed = [...new Set(words)];
// Output unique only words, from new array named "removed"
console.log('Removed (Non Duplicates)', removed);  

Объединение для удаления некоторых запрещенных слов, а также дубликатов.

 // Filtering words and duplicates

// Word List
let words = [ 'one',
              'one',
              'two',
              'two2',
              'ass',
              'as']

// Banned Words
let banned = ['ass']

// Contains word, accepts a string and a list as an array
contains = (search, list) => {
  // Determine if the list has a string
  return list.some(item => {
    return item.includes(search)
  });
};

// Function for filtering, and removing duplicates and banned words
function filter() {
  // Remove duplicates first, update word list
  words = [...new Set(words)];
  // Iterate through banned word list
  banned.forEach((word) => {
    // Output that banned word was found
    console.log('Found Banned (Word):', word)
    if (contains(word, words)) {
        // Update final word list
        words.splice(words.indexOf(word), 1);
    }
  })
}

console.log('Previous Results', words)
// Run filter function
filter()
// Output results
console.log('Final Results', words)