2017-03-11 6 views
0

So habe ich das seltsamste Problem vorstellen, habe ich ein Javascript-Array, das viele Nachnamen enthält, soll es durch den Text gehen und Namen durch Radfahren durch die Wörter, die es gegeben ist und sie in ein indexOf des Feldes, um zu sehen, wenn es nicht-negativ ist, jedoch machte ich einen Fehler beim Teilen des Feldes zuerst, wo ich auf Regex \ s teilte, und es hatte eine leere Zeichenkette zwischen den einzelnen regulären Strings. Lustig genug, dass man tatsächlich funktioniert, aber als ich es reparierte, um \ n aufzuspalten, war das Array das gleiche (minus die leeren Zeichenfolgen), aber jetzt weigert es sich, über den indexOf bei den gleichen Eingaben übereinzustimmen. Ich habe einen Haltepunkt in die Konsole gesetzt, um es selbst zu überprüfen, aber ich fand den seltsamsten Zufall, auf den ich noch stoßen muss (Bilder unten).Javascript-Array weigert sich, IndexOf zurückzugeben, auch wenn Übereinstimmung auftritt

The initial accident, which oddly works

The fix which somehow doesn't work

Ich habe viel Erfahrung Codierung, aber ich habe keine Ahnung, was hier los, bitte helfen Sie.

Hier ist der Code als Referenz

function findPeople(text,nameList){ 
    text=text.replace(/[^a-z0-9\s]/gi, " "); 
    text=text.replace(/\s+/gi," "); 
    var spliText=text.split(/\s+/gi); 
    nameList=nameList.split("|") 
    var fnames=nameList[0].split(/\s/gi); 
    var lnames=nameList[1].split(/\s/gi); 
    console.log(fnames.slice(0,15),lnames.slice(0,15)) 
    var matches = []; 
    for (var i=0;i<spliText.length;i++){ 
     var word1=spliText[i].toLowerCase(); 
     try{var word2=spliText[i+1].toLowerCase();}catch(e){word2="NOPE";} 
     try{var word3=spliText[i+2].toLowerCase();}catch(e){word3="NOPE";} 
     try{var word4=spliText[i+3].toLowerCase();}catch(e){word4="NOPE";} 
     if (fnames.indexOf(word1) != -1 && lnames.indexOf(word3) != -1 && word1!=word3 && !/(st|ln|lane|rd|road|dr|blv|cir|way|wy|pass)(?![a-z])/i.test(word4) && matches.indexOf(word1 + " " + word3) == -1){ 
       matches.push(word1 + " " + word3); 
     }else if (fnames.indexOf(word1) != -1 && lnames.indexOf(word2) != -1 && word1!=word2 && !/(st|ln|lane|rd|road|dr|blv|cir|way|wy|pass)(?![a-z])/i.test(word3) && matches.indexOf(word1 + " " + word2) == -1){ 
       matches.push(word1+" "+word2); 
     }else if (fnames.indexOf(word1) != -1 && !/(st|ln|lane|rd|road|dr|blv|cir|way|wy|pass)(?![a-z])/i.test(word2) && matches.indexOf(word1) == -1){ 
       matches.push(word1); 
     } 
    } 
    return matches; 
} 
+0

Warum haben Sie das 'g' Flag auf allen Ihren regulären Ausdrücken? – Pointy

+0

poste auch dein Array. – mehulmpt

+0

die 'Working Fix' und die' Non Working Fix' Arrays, soll ich sagen. – mehulmpt

Antwort

-1

Ich bin kein Problem sehen

var matches1 = findPeople("Brendon K. Smith", "brendon seth|smith gordon"); 
console.log(JSON.stringify(matches1)); // outputs ["brendon smith"] as expected 
var matches2 = findPeople("Brendon Gordon", "brendon seth|smith gordon"); 
console.log(JSON.stringify(matches2)); // outputs ["brendon gordon"] as expected 
var matches3 = findPeople("Seth", "brendon seth|smith gordon"); 
console.log(JSON.stringify(matches3)); // outputs ["seth"] as expected 

function findPeople(text,nameList){ 
    text=text.replace(/[^a-z0-9\s]/gi, " "); 
    text=text.replace(/\s+/gi," "); 
    var spliText=text.split(/\s+/gi); 
    nameList=nameList.split("|") 
    var fnames=nameList[0].split(/\s/gi); 
    var lnames=nameList[1].split(/\s/gi); 
    console.log(fnames.slice(0,15),lnames.slice(0,15)) 

    var matches = []; 
    for (var i=0;i<spliText.length;i++){ 
     var word1=spliText[i].toLowerCase(); 
     try{var word2=spliText[i+1].toLowerCase();}catch(e){word2="NOPE";} 
     try{var word3=spliText[i+2].toLowerCase();}catch(e){word3="NOPE";} 
     try{var word4=spliText[i+3].toLowerCase();}catch(e){word4="NOPE";} 
     if (fnames.indexOf(word1) != -1 && lnames.indexOf(word3) != -1 && word1!=word3 && !/(st|ln|lane|rd|road|dr|blv|cir|way|wy|pass)(?![a-z])/i.test(word4) && matches.indexOf(word1 + " " + word3) == -1){ 
       matches.push(word1 + " " + word3); 
     }else if (fnames.indexOf(word1) != -1 && lnames.indexOf(word2) != -1 && word1!=word2 && !/(st|ln|lane|rd|road|dr|blv|cir|way|wy|pass)(?![a-z])/i.test(word3) && matches.indexOf(word1 + " " + word2) == -1){ 
       matches.push(word1+" "+word2); 
     }else if (fnames.indexOf(word1) != -1 && !/(st|ln|lane|rd|road|dr|blv|cir|way|wy|pass)(?![a-z])/i.test(word2) && matches.indexOf(word1) == -1){ 
       matches.push(word1); 
     } 
    } 
    return matches; 
} 
+0

Das wäre im ersten Fall wahr, wo ich auf/s aufgespalten habe, aber der zweite ist der, der nicht funktioniert, wobei ich auf \ n aufspalte, damit alle \ n Zeichen entfernt werden. Es kann aber auch andere unsichtbare Zeichen geben, also denke ich, dass das eine gute Vermutung sein könnte, und das war es, was die zusätzlichen Splits anzog und machte. –

+0

Wissen Sie, ob es eine Möglichkeit gibt, die js an der Eingabeaufforderung versteckte Zeichen anzeigen zu lassen? –

+0

Also überprüfte ich es mit JSON.stringify, und es gab zurück, dass dort keine unsichtbaren Zeichen sind. –

-1

ich es endlich gelöst. Aus irgendeinem Grund gab JSON das versteckte Zeichen/r nicht zurück, also gab es ein verstecktes/r, das nicht geteilt wurde.

Vielen Dank für die Hilfe!

Verwandte Themen