Substr 从一个字符或另一个字符开始

Substr starting at one character OR one other character

我有一个函数接受一个参数并且需要return那个参数作为它原始字符串的子串:

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

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

  return selectorSubstr;
};

参数都是html个元素:

$("div") => "div"

&

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

&

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

&

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

我需要 lastIndexOf 从“.”的最后一个实例开始html class 或 html id 的“#”。

目前 lastIndexOf 仅适用于第一个参数并且不考虑'||' for ' 或其他参数。

有什么建议吗?

对于像这样的问题和许多其他像 lodash 这样的库会非常方便。他们将为您节省大量时间。例如,lastIndexOf 的 link 支持一个 fromIndex 来告诉它从哪里开始等。

你也可以很容易地在你的情况下做到这一点,但在一天结束时你会 运行 有很多其他类似的问题,其中 1 个函数调用 lodash 会解决它,最好只是将它添加为您的工具带 imo 的一部分。

总是第一个条件为真,因为两个选择器都有 .,因此最后一个索引总是在第一个条件中定义。

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);
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 的要求,我对 return 整个输入字符串进行编辑,以防它不包含 # 或 .

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,但是您无法仅从 return 值