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

編集を確認した後、これが私が提案するものです。正規表現の助けを借りて、独自のワイルドカード システムを作成する必要はなく、任意のパターンを作成できます。正規表現は究極のワイルドカードです:

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 に答える
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 に答える