2016-07-06 60 views
0

我有一個JSON數組:搜索的JavaScript

var arr = 
[ 
    { 
    "path": "a/b/c/*", 
    "id": "1" 
    }, 
    { 
    "path": "l/m/*/n", 
    "id": "2" 
    }, 
    { 
    "path": "a/b/c/d/*", 
    "id": "3" 
    } 
] 

我想它匹配的輸入參數, 一樣,如果我通過輸入字符串和數組元素的ID我應該得到的ID

foo(input,arr); 

所以

var input = 'a/b/c/5'; //or input = 'a/b/c/4'; 
foo(input,arr) // should return 1 

類似

var input = 'l/m/78/n'; 
foo(input,arr); // should return 2 

同樣

var input = 'a/b/c/d/1'; 
foo(input,arr); // should return 3 

所以我想*要同時搜索通配符。 我在實現這個過程中遇到了很多困難,任何幫助都將不勝感激。

回答

3

轉換每個pathregular expression,指出對於一個通配符正則表達式是.*代替*。根據您的更新問題

,並假設通配符只能匹配數,正則表達式變成[0-9]+

var arr = [{"path": "a/b/c/*","id": "1"}, 
 
      {"path": "l/m/*/n","id": "2"}, 
 
      {"path": "a/b/c/d/*","id": "3"} 
 
      ]; 
 

 
function foo(input, arr) { 
 
    var i, RE; 
 
    
 
    for(i = 0 ; i < arr.length ; i++) { //iterate through the array 
 
    RE = new RegExp(arr[i].path.replace(/\*/g, '[0-9]+')); //convert path to regexp 
 
    if(RE.test(input)) { //test for a match 
 
     return arr[i].id; 
 
    } 
 
    } 
 
} 
 

 
console.log(foo('a/b/c/5', arr)); 
 
console.log(foo('l/m/78/n', arr)); 
 
console.log(foo('a/b/c/d/1', arr));

+0

非常感謝,它是這樣的幫助。 – Abhijeet

+0

我錯過了一個場景,只是對問題進行了更新,如果我傳遞了a/b/c/d/1,它的返回id = 1,但是應該提供id = 3,解決方案將失敗 – Abhijeet

+0

您能否更新回答,我會高度負責 – Abhijeet

1

function foo(input,arr){ 
 

 
for(var i in arr){ 
 
    var re = new RegExp(arr[i].path.replace(/\*/g, '.*')); 
 
    if (re.test(input)) { 
 
\t \t return arr[i].id; 
 
    } 
 
} 
 

 
return null; 
 

 
} 
 

 
var arr = 
 
[ 
 
    { 
 
    "path": "a/b/c/*", 
 
    "id": "1" 
 
    }, 
 
    { 
 
    "path": "l/m/*/n", 
 
    "id": "2" 
 
    } 
 
]; 
 

 

 
document.write(foo("l/m/1/n",arr));

+0

是的,更正@andreas –

1

這裏是一個正則表達式的免費版本:

var arr = [{ 
 
\t 'path' : 'a/b/c/*', 
 
\t 'id' : '1' 
 
}, { 
 
\t 'path' : 'l/m/*/n', 
 
\t 'id' : '2' 
 
} 
 
] 
 
function search(arr, input) { 
 
input = input.split('/'); 
 
return arr.filter(function (el) { 
 
\t var value = el.path.replace('*', '').split('/'); 
 
\t var passed = true; 
 
\t for (var i = 0; i < value.length; i++) { 
 
\t \t if (input[i].length < 1 || value[i].length < 1 || input[i] == value[i]) {} 
 
\t \t else { 
 
\t \t \t passed = false; 
 
\t \t } 
 
\t } 
 
\t return passed; 
 
}) 
 
} 
 
console.log(search(arr, 'a/b/c/5')); 
 
console.log(search(arr, 'l/m/78/n'));