söka i en array när söksträngen innehåller jokertecken i typescript/javascript?


Jag har en lista med telefonnummer. Jag har också en söksträng. Söksträngen tillhandahålls av användaren. Söksträngen kan innehålla jokertecken som asterisk (*) eller frågetecken (?). Jag behöver ett sätt att filtrera element från min telefonnumsarray.

 The following is my phone number array.
    let mobileNumbersArray = ["830456481", "831456481", "9886503103" ]

    **Condition 1** 
    when search string is * 
    let searchString = "*" 
    expected result = ["830456481", "831456481", "9886503103"]
    
    **Condition 2**
    when search string is 83* 
    let searchString = "83*" 
    expected result = ["830456481", "831456481"]
    
    **condition 3**
    let searchString = "*456*"
    expected result = ["830456481", "831456481"]
    
    **condition 4**
    exact search
    let searchString = "9886503103"
    expected result = ["9886503103"]
    
    **condition 5**
    exact search
    let searchString = "83?4"
    expected result = ["830456481", "831456481"]

hur kan jag uppnå att söka efter en sträng i min telefonnummer-array och få resultatet som en array på det renaste sättet möjligt.

värdesätter all hjälp

tack.

Svar #1

Jag tror att jag kan ha en intressant lösning. Vänligen titta på följande kodsnutt och låt mig veta om det fungerar för dig.

Du kan läsa om reguljära uttryck på MDN.

Sedan om RegExp-konstruktorn. Här är nyckeln. Inte alla vet att du kan skapa reguljära uttryck dynamiskt.

Uppdatering: :

Idén är att översätta 'wildcard'-syntaxen till en RegExp-syntax, så här:

  • ? betyder: 'vilket som helst enskilt nummer', i RegExp: [0-9] eller \d

  • * betyder: 'ett eller flera nummer', i RegExp: .+ (detta betyder egentligen ett eller flera 'vad som helst')

Det är därför jag gör den dubbla ersättningen i början innan jag skickar frågan till RegExp-konstruktorn.

Slutligen, ja, detta kan utvidgas för att fungera med icke-siffertecken. Det räcker att ersätta [0-9] med .

function queryNumbers(array, query) {
  const src = query.replace(/\?/g, '[0-9]').replace(/\*/g, '.+');
  const regexp = new RegExp('^' + src + '$');
  return array.filter((item) => regexp.test(item));
}

const mobileNumbersArray = ['830456481', '831456481', '9886503103'];

console.log(queryNumbers(mobileNumbersArray, '*'));
console.log(queryNumbers(mobileNumbersArray, '83*'));
console.log(queryNumbers(mobileNumbersArray, '*456*'));
console.log(queryNumbers(mobileNumbersArray, '9886503103'));
console.log(queryNumbers(mobileNumbersArray, '83?4*'));
console.log(queryNumbers(mobileNumbersArray, '8*'));

Svar #2

Det enklaste sättet jag kan föreställa mig är att använda reguljära uttryck. Du kan lära dig mer om det här.