Создание функции поиска для строк в Javascript - React Native - PullRequest
0 голосов
/ 30 ноября 2018

Я пытаюсь создать функцию, которая будет искать определенные слова.

Например, если я коснусь буквы «О», первым результатом будет слово «Оазис» (а не «U2 - Still Haven»).t Found What I'm ... "и все другие песни, в их словах есть буква" O ") или любое другое среднее слово.
Необходимо игнорировать пробелы -" ", the char" - "(""-" ") и 'или другие символы, поэтому он соединит все слова вместе.
Например, когда я нажимаю "dontlookbackin", при поиске будет найдено слово, начинающееся с первой нажатой буквы, затем другая буква в слове и т. Д.

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

Специальная часть функции поиска:

 SearchSong = () => {
    console.log("Pressed")
    var e = this.state.searchRes;
    if (e == "") {
      return;
    }
    var musicList = [];
    var songs = [];
    if (this.state.songs != null) {
      songs = this.state.songs;  
       musicList = songs.filter(song =>
        song.Song_Name.toLowerCase().includes(e.toLowerCase())
      );

Пример текущего поиска - The corrent simple search

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

Ответы [ 3 ]

0 голосов
/ 30 ноября 2018

Что-то в этом духе должно помочь вам начать (см. Комментарии):

function removeUnwantedChars(str) {
    return str.replace(/\W/g, "");
}

function search(str) {
    // Create regex like "abc" becomes "^a.*b.*c"
    str = removeUnwantedChars(str);
    if (!str) {
        return [];
    }
    const searchRex = new RegExp(
        "^" +
        RegExp.escape(str.charAt(0)) + [...str.substring(1)].map(ch =>
            ".*" + RegExp.escape(ch)
        ).join(""),
        "i"
    );
    // Search for matches
    return songs.filter(song => searchRex.test(song.Song_Name.replace(/\W/g, "")));
}

... с использованием функции экранирования регулярных выражений в соответствии с теми, что в ответы на этот вопрос .

Live Пример:

if (!RegExp.escape) {
    RegExp.escape = function(string) {
      return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
    };
}

const songs = [
    {Song_Name: "U2 - I Still Haven't Found What I'm Looking For"},
    {Song_Name: "Oasis - Champagne Supernova"},
    {Song_Name: "Oasis - Don't Look Back In Anger"},
    {Song_Name: "The Rolling Stones - Like A Rolling Stone"}
];

function removeUnwantedChars(str) {
    return str.replace(/\W/g, "");
}

function search(str) {
    // Create regex like "abc" becomes "^a.*b.*c"
    str = removeUnwantedChars(str);
    if (!str) {
        return [];
    }
    const searchRex = new RegExp(
        "^" +
        RegExp.escape(str.charAt(0)) + [...str.substring(1)].map(ch =>
            ".*" + RegExp.escape(ch)
        ).join(""),
        "i"
    );
    // Search for matches
    return songs.filter(song => searchRex.test(song.Song_Name.replace(/\W/g, "")));
}

const testStrings = [
  "oasisdontlookbackin",
  "oasisanger",
  "therollstone",
  "rolling" // no match
];
for (const str of testStrings) {
  console.log(str, "=>", search(str));
}
.as-console-wrapper {
  max-height: 100% !important;
}

.* в регулярном выражении означает «любое число любого символа здесь», что означает, что вам не нужно вводить каждые значимый символ после первого (поэтому "oasisanger" работает).Но это включает в себя ваше требование, чтобы первый символ совпадал с первым символом имени.

0 голосов
/ 30 ноября 2018

Попробуйте это: song.Song_Name.toLowerCase (). Начинается с (e.toLowerCase ())

0 голосов
/ 30 ноября 2018
let strKeyword = "string001";
    musicList = [];
    songsLength = songs.length;

for (i = 0; i < songsLength; i++) {
    if (songs[i].Song_Name.replace(/[^a-zA-Z0-9]/g, "").substr(0, strKeyword.length).toLowerCase() == strKeyword.toLowerCase()) {
        musicList.push(songs[i]);
    }
}

console.log(musicList);
...