2014-12-12 3 views
0

내가 JSON 배열 아래와 같이 가지고 :검색 JSON 배열

[ 
    {"value":"uk-icon-adjust","title":"Adjust","url":"#", "text":""}, 
    {"value":"uk-icon-adn","title":"Adn","url":"#", "text":""}, 
    {"value":"uk-icon-align-center","title":"Align center","url":"#", "text":""}, 
    {"value":"uk-icon-align-justify","title":"Align justify","url":"#", "text":""}, 
    {"value":"uk-icon-align-left","title":"Align left","url":"#", "text":""} 
] 

나는 특정 타이틀이 JSON 배열을 검색합니다. 하지만 문제는 내가 Regex로 검색하려고한다는 것입니다. 예 : sb가 "ad"를 검색하면 함수가 처음 두 개의 json 문자열 (Adjust 및 Adn)을 반환해야합니다.

나는 이것을 달성 할 수있는 자바 스크립트 기능을 설정하기 위해 지금은 모른다.

몇 가지 아이디어가 있습니까?

+0

안녕하세요, http://www.json.spiritway.co에서 나는 정확하게이 목적을 위해 만든 라이브러리를 시도 – mgwhitfield

답변

4

이 시도 사용하여 필터링 할 수 있습니다

var array = [ 
    {"value":"uk-icon-adjust","title":"Adjust","url":"#", "text":""}, 
    {"value":"uk-icon-adn","title":"Adn","url":"#", "text":""}, 
    {"value":"uk-icon-align-center","title":"Align center","url":"#", "text":""}, 
    {"value":"uk-icon-align-justify","title":"Align justify","url":"#", "text":""}, 
    {"value":"uk-icon-align-left","title":"Align left","url":"#", "text":""} 
    ], 
    searchString = 'ad', 
    searchRegExp = new RegExp(searchString , 'i'); // 'i' makes the RegExp ignore case 

var result = array.filter(function(e){ // Filter out any items that don't pass the 
    return searchRegExp.test(e.title); // RegExp test. 
}); 

결과 :

[ 
    {"value":"uk-icon-adjust","title":"Adjust","url":"#","text":""}, 
    {"value":"uk-icon-adn","title":"Adn","url":"#","text":""} 
] 

에만 제목 배열이 필요한 경우 다음과 같이 결과를 매핑 할 수 있습니다.

var titles = result.map(function(e){ 
    return e.title; 
}); 

제목 :

["Adjust", "Adn"] 

당신은 효율성을 위해, 배열을 필터링 후이 매핑 을 수행 할 수 있습니다. 이 방법을 사용하면 먼저 전체 개의 항목을 반복하여 필터링 한 결과를 필터링 한 다음 모두 개를 반복하여 필터링하여 필터링 된 결과를 반복하면됩니다. 물론

,이는 필터링과 결합 할 수 있습니다

var result = array.filter(function(e){ 
    return searchRegExp.test(e.title); 
}).map(function(e){ 
    return e.title; 
}); 

모두 Array.prototype.filter()Array.prototype.map()으로는 IE 8 이하에서 지원되지 있음을 유의하시기 바랍니다. 그러나 링크 된 페이지에는 이전 버전의 IE에서 이러한 함수가 작동하도록 일부 polyfill이 있습니다.

+0

만약 json 배열이 extern json 파일에서 검색한다면 어떨까요? 나는이 방법을 시도 : var 배열 = $ .getJSON (URL); ' 하지만 필터 기능을 작동하지? – Smeaven

+0

@Smeaven : 왜냐하면'getJSON'은 비동기식이기 때문입니다. [이 질문을 참조하십시오] (http://stackoverflow.com/questions/15764844/jquery-getjson-save-result-into-variable) – Cerbrus

+0

thx, 이제 작동하지! – Smeaven

3

네이티브 개체입니다. 먼저 Array.map를 사용하여 제목의 배열을 생성하여, 비록이 방법을 다음 Array.filter

var titles = obj.filter(function(o){ 
    return /^ad/i.test(o.title); 
}).map(function(o){ return o.title; }); 
+0

@nhahtdh이 그것을 잊어 버렸습니다. 감사합니다 –

+0

'map' 앞에'filter'를 사용하는 것이 더 효율적입니다. – Cerbrus

+1

@Cerbrus 제 생각에 마이크로 최적화라고 생각합니다. 나는 전에 그것을 들었다. 그렇게 말하는 링크를보고 싶어합니다. 솔직히 –

2

Amit Joki 대답은 답변입니다. 당신이지도를()를 사용하지 않으려면
, 당신은 또한 시도 할 수 :

var json = [ 
    {"value":"uk-icon-adjust","title":"Adjust","url":"#", "text":""}, 
    {"value":"uk-icon-adn","title":"Adn","url":"#", "text":""}, 
    {"value":"uk-icon-align-center","title":"Align center","url":"#", "text":""}, 
    {"value":"uk-icon-align-justify","title":"Align justify","url":"#", "text":""}, 
    {"value":"uk-icon-align-left","title":"Align left","url":"#", "text":""} 
]; 

function search(array, re) { 
    var regexp = new RegExp(re, 'gi'); 
    for (var i = 0; i < array.length; i++) { 
     return array[i].title.match(regexp); 
    } 
    throw "Couldn't find object like " + re; 
} 

console.info(search(json, 'ad')); 
+0

'obj.map'과 같은 것은 존재하지 않습니다. – Cerbrus

+0

map() 메쏘드는 어떤 obj 배열에도 적용됩니다. – MarcoS

+0

@Cerbrus :'obj'가 배열 인 경우가 있습니다. –