根据搜索词按相关性合并和排序多个JavaScript数组

时间:2016-04-11 18:32:12

标签: javascript arrays sorting javascript-objects

我认为MDN article on Template Literals之前已经问过这个问题,但我似乎无法弄明白。我的cordova应用程序中有两个来自SQL数据库的数组。是否可以组合这两个数组,并通过与搜索查询的最佳匹配进行排序。

在我的应用程序中,我有一个搜索功能,可以通过最佳匹配搜索多个本地表和订单。这很好用

SQL查询示例:

val featureAssembler = new VectorAssembler().
  setInputCols(featureArray).
  setOutputCol("features")

重复此过程,并为要搜索的不同表创建不同的数组。

我留下了2个用户表和一个用于留言内容的表。在SQL查询运行回调函数之后,然后将所有结果排序为1个数组:

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);

是否有一种方法可用于遍历数组 allResults 并重新排序此数组以匹配搜索查询。

数组输出类似于搜索' user':

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 = [
{
    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
];

1 个答案:

答案 0 :(得分:2)

由于您未在返回的SQL中包含相关性分数,因此无法组合两个数组。

首先,您需要将分数作为SQL的一部分返回:

tx.executeSql("SELECT *,(CASE WHEN f_name = ? THEN 1 WHEN f_name LIKE ? THEN 2 ELSE 3 END) as Score 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);

然后,您将能够组合数组并按“分数”排序。柱:

allResults.sort(function(a,b){ return a.Score-b.Score; });