2016-07-06 6 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" 
    } 
] 

Я хочу идентификатор элемента, который соответствует входным параметров, как если я прохожу входную строку и массив я должен получить идентификатор

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

Преобразовать каждый path в regular 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'));