2014-12-16 3 views
0

SQLite가 매우 느리기 때문에 필요한 모든 레코드를 선택하고 배열에 저장합니다.SQL처럼 % LIKE %로 배열로 검색

이제 내 응용 프로그램에는 사용자가이 배열에서 문자열의 일부를 검색 할 수있는 검색 섹션이 있습니다.

내 배열 구조는 다음과 같습니다

[ 
    { 
    name : 'Black', 
    family : 'Dragon', 
    email : '[email protected]' 
    } 
] 

나는 사용자가 일부 문자를 입력 할 수 있습니다 내 페이지에서 3 개 입력 필드를 가지고 있고이 배열에서 검색과 일치하는 값의 인덱스를 반환해야합니다.

예를 들어 사용자가 bla 또는 lack 또는 @blahblah을 입력하면 내 프로그램에서이 값의 색인을 반환해야합니다.

가능합니까? 어떻게 일해야합니까?

+0

당신은 각 객체를 반복하고 일치하는 값을 얻기 위해 각 필드에 대해 정규 표현식 (정규식)를 사용하거나 바퀴를 재발견하지 않으려면 [taffydb] (HTTP를 사용할 수해야합니다 : //www.taffydb.com/), JavaScript와 같은 데이터베이스 기능을 제공합니다. – frank

+0

인덱스를 올바르게 설정했다면 SQLite는 대부분의 쿼리에서 일반적으로 매우 빠릅니다. (삽입은 또 다른 문제입니다.) 어떤 경우라도, 모든 레코드 (실제로 레코드의 수에 따라 빠름)를 스캔하지 않으려면 [인덱스] (http : //en.wikipedia.org/wiki/Search_engine_indexing#Index_data_structures). 정말 성능이 필요한 경우 접미사 트라이를 사용하는 것이 좋습니다. – Cameron

+0

@ frank :'taffydb'는 인덱스를 지원하지 않으므로 (https://github.com/louischatriot/taffydb-benchmark), 레코드를 수동으로 스캔하는 것만 큼 빠르고 간단합니다. (정규 표현식 대신에'indexOf'를 사용하는 것이 일반적으로 더 빠르다). – Cameron

답변

1

Underscore 또는 LoDash은 이와 같은 배열 작업에 매우 편리합니다.

function getMatchingIndex(yourArray, searchTerm) { 
    return _.findIndex(yourArray, function(obj) { 
    return _.contains(obj, searchTerm); 
    }); 
} 
0

각도를 사용하는 경우 필터를 사용하면됩니다. 이 당신이 원하는 것을 상자 중 하나, 그리고 심지어 공식 튜토리얼에서 언급 한 것 :

https://docs.angularjs.org/tutorial/step_03

리피터에서 데이터를 필터링 할 경우 바로 수행

Search: <input ng-model="query"> 
<ul> 
    <li ng-repeat="dataItem in dataArray | filter:query"> 
    {{data.name}} 
    <p>{{data.family}}</p> 
    <p>{{data.email}}</p> 
    </li> 
</ul> 
0

당신에게 Alasql JavaScript SQL 라이브러리로이 작업을 수행 할 수 있습니다. SQLite보다 빠르지 만 JavaScript 배열의 SQL에서도 계속 작동합니다.

var res = alasql('SELECT * FROM ? WHERE email LIKE ?',[data, enter]); 

는 (그래서, Alasql는 SQL 문을 구문 분석에 지출 시간이 필요하지 않습니다)는 SELECT 문을 미리 컴파일 할 수 있습니다 실행 속도를 높이려면.

// Initialization 
var mySelect = alasql.compile('SELECT * FROM ? WHERE email LIKE ?'); 

// Execution time 
var res = mySelect([data, enter]);