我在导航树中有节点。我想选择属于url的所有节点,以便我可以突出显示它们。我有它工作,但忘了一个边缘情况,其中url的最后一部分以相同的字符串开头。
在这种情况下,如果有人在网址/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/
不确定是否可以使用正则表达式,我想其他解决方案是拆分节点和/
上的当前网址进行比较。
答案 0 :(得分: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();
}());
答案 1 :(得分: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',
]);
});
});
答案 2 :(得分:1)
如果
,测试将通过new RegExp(node + '.*')
更改为
new RegExp(node + '(/|$)')
除非node
后跟/
或字符串结尾,否则会阻止匹配。