2

ナビゲーション ツリーにノードがあります。URL の一部であるすべてのノードを選択して、強調表示できるようにします。私はそれを機能させましたが、URL の最後の部分が同じ文字列で始まるエッジ ケースを忘れていました。

この場合、誰かがその URLにいる場合は、 and/products/foobar-superを選択したいのですが、./products/products/foobar-super/products/foobar

describe('part of url', function () {

  it('matches /products and /products/foobar-super', function () {

    var current = '/producten/foobar-super';

    var nodes = [
      '/products',
      '/products/foobar',
      '/products/foobar-super',
    ];

    var result = [];

    nodes.forEach(function (node) {
      if (new RegExp(node + '.*').test(current)) {
        result.push(node);
      }
    });

    result.should.eql([
      '/products',
      '/products/foobar-super',
    ]);

  });

});

Jsfiddle テスト: http://jsfiddle.net/RKDga/2/

正規表現で可能かどうかわからない他の解決策は、ノードと現在のURLを分割して/比較することです。

4

3 に答える 3

1

次のコードは、 JSFIDDLEに役立つ場合があります

    /*globals mocha: true, describe: true, it: true, beforeEach:true */
(function() {
    function assert(expr, msg) {
        if (!expr) throw new Error(msg || 'failed');
    }

    mocha.setup({
        ui: "bdd",
        ignoreLeaks: true
    });

    describe('part of url', function () {

      it('matches /products and /products/foobar-super', function () {

        var current = '/products/foobar-super';

        var nodes = [
          '/products',
          '/products/foobar',
          '/products/foobar-super',
        ];

        var result = [];
         ;
    var urllist =  current.split("/");
   var temp; 
    nodes.forEach(function (node) {
       temp = "";
      for(var i=1;i<urllist.length; i++){
            temp += "/"+ urllist[i];
          if(node == temp){
             result.push(node );
          }
      }
    });

 console.log(result);          

        assert(result[0] === '/products', 'first item should be /products');
        assert(result[1] === '/products/foobar-super', 'second item should be /products/foobar-super');


      });

    });


mocha.run();
}());
于 2013-03-17T19:47:45.930 に答える
1

正規表現を使用しない別のソリューションを次に示します。

describe('part of url', function () {

  it('matches /products and /products/foobar-super', function () {

    var current = '/products/foobar-super';

    var nodes = [
      '/products',
      '/products/foobar',
      '/products/foobar-super',
    ];

    var result = [];

    nodes.forEach(function (node) {

      var node_parts = node.split('/');
      var current_parts = current.split('/');
      var match = true;

      node_parts.forEach(function (node_part, i) {

        if (node_part !== current_parts[i]) {
          match = false;
        }

      });

      if (match) {
        result.push(node);
      }

    });

    result.should.eql([
      '/products',
      '/products/foobar-super',
    ]);

  });

});
于 2013-03-17T19:52:55.327 に答える
1

次の場合にテストに合格します。

new RegExp(node + '.*')

に変更されます

new RegExp(node + '(/|$)')

文字列の末尾またはnode後に続く場合を除き、一致を防ぎます。/

于 2013-03-17T20:16:58.273 に答える