0

我在 JavaScript 中有一个数组,索引如下net.up, net.down, net, err, err.warn

我有一个字符串,我需要找到与该字符串匹配的所有索引。匹配有一些特殊的规则,但是......

'net.*' 会返回net.up, net.down
'err' 只会返回err

它非常严格,即“net.u*”不会返回任何内容。

目前,我正在考虑按句点拆分字符串并将每个段与每个段进行比较,但这似乎很幼稚。

根据要求,我的代码有效,但我觉得太天真了,希望改进:

o = {"hey":0,"hey.a":1,"hey.b":1,"no":0};
srch = "hey.*".split(".");
for(i in o) {
  match = true;
  parts = i.split(".");
  for(j=0;j<srch.length;j++) {
    if (parts[j]=="*" || srch[j]=="*") continue;
    if (parts[j] != srch[j]) {
      match=false;
      break; } }
  if (match)
    document.write("match: "+i+"<br>"); }
4

3 回答 3

0

如果我正确理解了问题和评论,那么也许您正在寻找这样的东西。

javascript

var o = {
    "hey": 0,
    "hey.a": 1,
    "hey.b": 1,
    "no": 0
};

function filterWild(object, search) {
    var length = search.length,
        matches = [],
        searchLength = Infinity,
        length;

    if (length > 2 && search.slice(-2) === ".*") {
        search = search.split(".");
        length = search.length ;

        if (length > 2) {
            search = search.slice(-1).join(".") + ".";
            searchLength = search.length;
        } else if (length === 2) {
            search = search[0] + ".";
            searchLength = search.length;
        } else {
            search = search[0];
        }
    }

    for (i in o) {
        if (o.hasOwnProperty(i) && i.slice(0, searchLength) === search) {
            matches.push(i);
        }
    }

    return matches;
}

console.log(filterWild(o, "hey"));
console.log(filterWild(o, "hey.*"));
console.log(filterWild(o, "hey.a*"));

输出

["hey"]
["hey.a", "hey.b"]
[] 

jsfiddle 上

这是上述函数与正则表达式版本的jsperf

一个可能的性能改进是使用语句来switch代替if..else,可能还有其他语句。

它不使用任何 ECMA5 代码,但确实需要 ECMA3 兼容性,所以它应该是相当浏览器友好的。

于 2013-06-17T23:04:44.747 回答
0

我不认为用句点分割字符串是天真的。要确定匹配,您需要验证输入字符串的每个部分是否与模式的每个部分匹配。这似乎正是您想要做的。

一种可能的优化方法——如果由于某种原因性能非常关键——可能是避免使用分配数组,split而是使用indexOf(以找到下一个点)和substring. 但是该代码会复杂得多,并且可能几乎没有任何速度,如果有的话。

于 2013-06-17T22:28:07.980 回答
0

在检查您的编辑后,这是我的建议,借助正则表达式,您可以制作任何您想要的模式,无需创建自己的通配符系统;正则表达式是终极通配符:

var obj = {"hey":0,"hey.a":1,"hey.b":1,"no":0};

var hey = Object.keys(obj).filter(function(key){
  return /^hey\.?.*?$/.test(key);
});

console.log(hey); //=> ["hey", "hey.a", "hey.b"]

编辑:如果您只想要一个通配符,您仍然可以使用正则表达式,如下所示:

function filterwild(obj, wild) {
  wild = new RegExp('^'+ wild.replace(/\.(.+?)\*/,'\\.$1.*?') +'$');
  return Object.keys(obj).filter(function(k){ return wild.test(k) });
}

console.log(filterwild(obj,'hey')); //=> ["hey"]
console.log(filterwild(obj,'hey.*')); //=> ["hey","hey.a","hey.b"]
console.log(filterwild(obj,'hey.a*')); //=> ["hey.a"]

wild给你一个正则表达式/^hey\.a.*?$/(最后一个例子)。不确定这是您需要的确切输出;您可以根据需要调整正则表达式。

这是上述内容的快速演示:http: //jsbin.com/ahixeq/2/edit

于 2013-06-17T22:30:25.637 回答