私はsomething similarにこれまでに質問されていますが、私はそれを理解しているようです。私は私のcordovaアプリでSQLデータベースから2つの配列を持っています。これらの2つの配列を組み合わせて、検索クエリに最適な順序で並べ替えることは可能ですか?検索用語に基づいて関連性の高い複数のJavaScript配列をマージして並べ替えます
私のアプリでは、複数のローカルテーブルと注文を最もよく検索する検索機能があります。これは細かい
SQLクエリの例を動作します:
tx.executeSql("SELECT * FROM contacts WHERE f_name LIKE ? ORDER BY (CASE WHEN f_name = ? THEN 1 WHEN f_name LIKE ? THEN 2 ELSE 3 END), f_name ",["%" + query + "%", query, query + "%"],onSuccess, onError);
このプロセスが繰り返され、異なるアレイが異なるテーブルが検索されているために作成されます。
私は、ユーザー用とメッセージ用の2つのテーブルが1つ残っています。 SQLクエリを実行した後にコールバック関数は、その後1つの配列にすべての結果をソートします。
var allResults = [];
// create an array of all
for(var x = 0; x < allChatSearchResults.users.length; x++){
var result = allChatSearchResults.users[x];
result['type'] = 'user';
allResults[allResults.length] = result;
}
for(var x = 0; x < allChatSearchResults.messages.length; x++){
var result = allChatSearchResults.messages[x];
result['type'] = 'message';
allResults[allResults.length] = result;
}
は、私は、配列をループしallResultsを使用して、検索クエリに一致するように、この配列を並べ替えることができます方法はあります。
allResults = [
{
type : 'user',
f_name : 'username',
l_name : 'somename'
},
{
type : 'message',
message : 'this is my user name', ////// query from sql matches this
date : '11/04/2016'
},
{
type : 'message',
message : 'another containing username', ////// query from sql matches this
date : '09/04/2016'
},
//and so on
];
全コード:
var searchResultsSource = 0;
var allChatSearchResults = {users : [], messages : []};
var searchChatResults = function (type, query, res){
searchResultsSource++;
if(res.length > 0){
for(var x = 0; x < res.length; x++){ allChatSearchResults[type][x] = res[x]; }
}
if(searchResultsSource == 2){
//run the function
console.log('Search Results', allChatSearchResults);
var allResults = [];
// create an array of all
for(var x = 0; x < allChatSearchResults.users.length; x++){
var result = allChatSearchResults.users[x];
result['type'] = 'user';
allResults[allResults.length] = result;
}
for(var x = 0; x < allChatSearchResults.messages.length; x++){
var result = allChatSearchResults.messages[x];
result['type'] = 'message';
allResults[allResults.length] = result;
}
// create an array of just search query
// reorder the array based on the ordered search query
}
};
var searchChats = function() {
var query = $('#activeChatSearch').val();
query = query.toLowerCase();
if(query.length > 3){
//search my chats
//search users and search messages
db.transaction(function(tx) {
var users = [];
var chats = [];
var messages = [];
tx.executeSql("SELECT * FROM contacts WHERE f_name LIKE ? ORDER BY (CASE WHEN f_name = ? THEN 1 WHEN f_name LIKE ? THEN 2 ELSE 3 END), f_name ",["%" + query + "%", query, query + "%"], function (tx, res){
if(res.rows.length == 0){ console.log('no users with first name ' + query); }
for(var x = 0; x < res.rows.length; x++){ users[x] = res.rows.item(x); }
searchChatResults('users', query, users);
}, function (tx, error){
console.log(error.message);
});
tx.executeSql("SELECT * FROM active_chats ORDER BY last_changed DESC", [], function (tx, res){
if(res.rows.length > 0){
var count = 0;
var max = res.rows.length;
var results = res.rows;
var searchThisChat = function (tx, query, chatID){
tx.executeSql("SELECT * FROM chat_" + chatID + " WHERE message LIKE ? ORDER BY (CASE WHEN message = ? THEN 1 WHEN message LIKE ? THEN 2 ELSE 3 END), message LIMIT 0,1", ["%" + query + "%", query, query + "%"], function (tx, res){
if(res.rows.length == 0){ /*console.log('No chats match query',messages); */ }
else { messages[messages.length] = res.rows.item(0); }
if(count == max){ searchChatResults('messages', query, messages); } else{ searchThisChat(tx, query, results.item(count).chat_id); count++; }
}, function (tx, e){
console.log(e.message);
if(count == max){ searchChatResults('messages', query, messages); } else{ searchThisChat(tx, query, results.item(count).chat_id); count++; }
});
};
searchThisChat(tx, query, res.rows.item(0).chat_id);
}
}, function (tx, e){
console.log(e.message);
});
}, function(err) {
console.log('Open database ERROR: ', err);
});
var activeChats = $('#activeChats');
activeChats.html('');
for(var x = 0; x < 6; x++){
var item = formatCurrentChatItem(
{f_name : query, l_name : 'Bloggs', 'user_id' : 18},
null,
null
);
item.appendTo(activeChats);
}
}
};
$(function() {
$('#activeChatSearch').on('input', searchChats);
$('#activeChatSearchBtn').on('click', searchChats); <- input function
});
あなたの質問は不明です。サンプルの入力と必要な出力を提供する – Amit
完全な機能を持っているだけで、少し長めにしてみました。 –
あなたの編集は(残念ながら)悪い編集です。あなたの完全なコードは必要ありません。 **サンプル入力と必要な出力**を提供する必要があります。それに失敗した場合は、関連コード(**のみ**関連コード)を含めてください。 – Amit