0

引数を取り、その引数を元の文字列の部分文字列として返す必要がある関数があります。

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

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

  return selectorSubstr;
};

引数はすべて html 要素です。

$("div")=>「分割」

&

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

&

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

&

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

「.」の最後のインスタンスから開始するには、lastIndexOf が必要です。html クラスの場合、または html id の場合は「#」。

現在、lastIndexOf は最初の引数に対してのみ機能し、'||' は考慮されません。for ' または他の引数。

助言がありますか?

4

3 に答える 3

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

編集: @Joe の要件に対処するために、この編集を行って、 # または .

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

なしで文字列を取得します。または # プレフィックス、呼び出すだけ

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

関数でもできreturn arr ? arr[0].slice(1) : selectorますが、戻り値だけから、それがクラスなのか、IDなのか、文字列全体なのか(一致しない場合)を判断する方法がありません

于 2016-06-26T14:03:50.147 に答える
1

このような問題や、lodashなどの他の多くのライブラリは非常に便利です。彼らはあなたの時間を大幅に節約します。たとえば、そこにある lastIndexOf へのリンクは、開始位置などを伝えるために fromIndex をサポートしています。

あなたのケースでもこれを簡単に行うことができますが、結局のところ、lodash への 1 つの関数呼び出しで解決される他の多くの同様の問題が発生するため、ツールベルト imo の一部として追加することをお勧めします。 .

于 2016-06-26T13:57:24.473 に答える