2016-06-26 10 views
0

Ich habe eine Funktion, die ein Argument nimmt und braucht dieses Argument als Teil von seiner ursprünglichen Zeichenfolge zurück:Substr an einem Zeichen beginnen oder ein anderes Zeichen

var $ = function (selector) { 
    var elements = []; 

    var selectorSubstr = selector.substr(selector.lastIndexOf(".") || selector.lastIndexOf("#") + 1); 

    return selectorSubstr; 
}; 

Die Argumente sind alle HTML-Elemente:

$("div") => "div"

&

$("img.some_class") => "some_class"

&

$("div.some_class#some_id") => "some_id"

&

$("div#some_id.some_class") => "some_class"

Ich brauche die lastIndexOf in letzter Instanz entweder eine starten '' für die HTML-Klasse ODER ein '#' für die HTML-ID.

Momentan funktioniert der lastIndexOf nur für das erste Argument und berücksichtigt nicht die '||' für 'oder das andere Argument.

Irgendwelche Vorschläge?

+0

Leider kann ich keine Bibliotheken für dieses Problem verwenden. – Joe

Antwort

1
var $ = function (selector) { 
    return selector.match(/[#\.][^\.#]+$/); 
} 

$("img.some_class")[0]; // ==> '.some_class' 
$("div.some_class#some_id")[0]; // ==> #some_id 
$("asbasifhwaehf"); // ==> null, no match 

EDIT: Adressierung @ Joe Anforderung, mache ich diese bearbeiten die gesamte Eingabezeichenfolge für den Fall zurück es nicht # enthält oder.

var $ = function (selector) { 
    var arr = selector.match(/[#\.][^\.#]+$/); 
    return arr ? arr[0] : selector 
} 

$("img.some_class"); // ==> '.some_class' 
$("div.some_class#some_id"); // ==> '#some_id' 
$("asbasifhwaehf"); // ==> 'asbasifhwaehf', no match 

um die Zeichenfolge ohne die zu erhalten. oder # Präfix, rufen Sie einfach

$("div.some_class#some_id").slice(1); // ==> 'some_id' 

Sie können auch return arr ? arr[0].slice(1) : selector in der Funktion, aber dann haben Sie keine Möglichkeit zu sagen, ob es sich um eine Klasse oder eine ID oder die gesamte Zeichenkette (keine Übereinstimmung Fall) nur aus dem Rückgabewert

+0

Danke, obwohl es immer sehr hilfreich ist, kurze Erklärungen mit Antworten zu haben. – Joe

+0

Die Zeile 'selector.match (/[#\.][^\.#]+$/)' durchsucht den Eingabe-String (Selektor) nach dem regulären Ausdruck '/[#\.][^\.#]+ $/'.Diese Regex bedeutet Suche nach einem Teilstring, der: - entweder mit # oder beginnt. ([# \.] part) - muss um 1 oder mehr Zeichen fortgesetzt werden, die weder # noch sind. ([^ \. #] + Teil) - der Teilstring muss am Ende der Eingabe sein ($ -Zeichen am Ende) –

+0

Brilliant, danke. – Joe

1

Für Probleme wie diese und für viele andere Bibliotheken sind Bibliotheken wie lodash sehr praktisch. Sie werden Ihnen viel Zeit sparen. Der Link zum lastIndexOf zum Beispiel unterstützt einen fromIndex, um zu sagen, wo er starten soll usw.

Sie könnten dies auch in Ihrem Fall tun, aber am Ende des Tages würden Sie mit so vielen anderen ähnlichen Problemen laufen 1 Funktionsaufruf zu lodash würde es lösen, dass es besser ist, es als Teil Ihres Werkzeuggürtels imo hinzuzufügen.

+0

danke, leider kann ich Bibliotheken für dieses Problem nicht verwenden. Ich werde es trotzdem überprüfen. – Joe

2

Immer ist die erste Bedingung wahr, da beide Selektoren . haben und daher der letzte Index immer in der ersten Bedingung definiert ist.

var classSelector = selector.lastIndexOf('.')? -1 : selector.lastIndexOf('.'); 
var idSelector = selector.lastIndexOf('#')? -1: selector.lastIndexOf('#'); 
if(idSelector>classSelector) 
selector.subStr(idSelector+1); 
else 
selector.subStr(classSelector+1); 
+0

Ah, natürlich danke! Ich habe auch eine anders herum, redigierte Frage, um das einzuschließen. – Joe

+0

Ist der Selektor am Ende der Zeichenfolge Ihre Anforderung. zB: **. some_class **, ** # some_class **, **. some_class ** –

+0

yep, der Selektor am Ende des Strings ohne '#' oder '.' – Joe