2012-11-26 5 views
15

의 내가 같이 대량의 객체 (1000) 목록을 가정 해 봅시다 :JavaScript에서 JSON 객체의 목록을 필터링하는 최고의 성능 방법은 무엇입니까?

[{name: 'john dow', age: 38, gender:'m'}, {name: 'jane dow', age: 18, gender:'f'}, ..] 

나는 이름 (문자 현명한)로이 목록을 필터링 할.

filter('j') => [{name: 'john dow', age: 38, gender:'m'}, {name: 'jane dow', age: 18, gender:'f'}, ..] 

filter('jo') => [{name: 'john dow', age: 38, gender:'m'}, ..] 

filter('dow') => [{name: 'john dow', age: 38, gender:'m'}, {name: 'jane dow', age: 18, gender:'f'}, ..] 

최고 성능을 발휘하는 방법은 무엇입니까? RegEx는 분명히 사용자 중 처음부터 이름을 시작하는 경향이 있다고 가정하면 사전에 목록을 정렬하는 것이 가장 좋은 방법 일 수 있지만 일부 경우에만 도움이됩니다.

필터를 매핑하기위한 JavaScript 내장 함수가 있습니까? 나는 그것들이 자바 스크립트 구현보다 더 빠를 것이라고 기대한다.

P .: 예. 제공하려는 "오프라인 기능"때문에 클라이언트 쪽에서 필터링하고 싶습니다. substring index (예 : Suffix tree A와)이이 빨리 만들 것입니다하지만

+3

실제로 자바 스크립트의 객체 인 경우 더 이상 JSON이 아닙니다. "JSON"은 해당 정보를 네트워크를 통해 전송할 때 사용되는 표기법입니다 (또는 저장 가능). JavaScript 프로그램 내에서는 단순히 "JavaScript 객체"입니다 (인코딩 된 JSON 데이터가 들어있는 문자열에 대해 이야기하지 않는 한, 더 이상 사용하기 전에 JavaScript 객체로 변환해야합니다). –

+0

"ohn"을 검색하면 어떨까요? –

+0

@ JoachimSauer 네가 맞아.나는 그것을 고쳤다;) 필터 ('ohn') => [{name : 'john dow', 나이 : 38, 성별 : 'm'}, ..] – wzr1337

답변

10

, 직접 검색은 다음과 같습니다

function (s, l) { 
    return l.filter(function (v) { 
     return v.name.find(s) !== -1; 
    }); 
} 
s 쿼리 문자열

l 개체의 목록입니다.

경험에서
+2

직선의 for 루프는 네이티브 필터보다 적어도 두 배 빠릅니다. https://jsperf.com/array-filter-performance – Mrchief

+0

@ Dan D. 하위 문자열 색인을 언급합니다. 예를들 수 있습니까? 오프라인 검색 기능이있는 유사한 응용 프로그램이 있습니다. 현재 검색을 위해 200,000 개의 객체를 갖는 것은 보통'.filter()' – mesqueeb

9

다음 알고리즘은 아주 잘 작동합니다

  1. 사용자 유형의 첫 글자, 당신은 (예를 들어, "J"를 어떤 사용자 유형에 따라 결과 아마도 Array.filter() 및 저장소를 사용하여 검색을 수행 할 때); 사용자 유형이 다른 편지 (예 : "O"), 당신은 ("J") 이전에 입력 된대로의 검색을 수행 할 때

  2. , 항목의 수를 감소시키는 것은

  3. 때 사용자 삭제를 통해 이동합니다 하나 이상의 문자를 검색 상자에 남아있는 것을 기반으로 저장된 검색을 찾으려고합니다. 모두 실패하면 빈 목록을 표시하고 이전에 저장된 검색을 무효화합니다.

+0

으로이 패턴을 구현하는 공유 할 라이브러리/코드 샘플만큼 빠르지 않습니까? –

+0

이것이 아주 좋은 접근 방법이라고 생각합니다 ... 도서관을 사용할 준비가 되었습니까? –

4

이 경우 성능에 대해별로 신경 쓰지 않아도됩니다. 데스크톱 컴퓨터는 땀을 흘리지 않고 1000 회 또는 10,000 회 평가를 받아야합니다. 기능을 해할 위험이 약간 효율적인 처리의 이점보다 높기 때문에 어떤 종류의 복잡한 최적화도 피할 수 있습니다.

자바 스크립트 (ECMAScript 5)는 배열 필터링을위한 새로운 방법을 제공합니다. 네이티브 메소드로서 좀 더 빠르다고 가정합니다.

var regex = ... 

results = json.filter(function(result) { 
    return regex.test(result.name) 
} 

Array.prototype.filter은 최신 브라우저에서 지원됩니다, http://kangax.github.com/es5-compat-table/를 참조하십시오. 구형 브라우저 용 패치는 다음과 같이 추가 할 수 있습니다. https://github.com/kriskowal/es5-shim

관련 문제