Javascript将重要性排序为字符串数组

时间:2017-11-02 11:29:29

标签: javascript angularjs arrays sorting typescript

我有一个包含服务器检索的数据的字符串数组。我想根据元素的重要性对该数组进行排序。

这是我的代码:

 // once the server is called, save the information by changing the order
let formattedData: Array<string> = this.$scope.sortResult(data_response, true);

// This is the function that should sort the data
public sortActions = (arrayToSort: Array<string>, firstList: boolean) => {
    if (!arrayToSort || !arrayToSort.length) {
        return;
    }

    let result: Array<string> = [];
    let j: any = null;

    let listOfImportance: any = null;
    if(firstList){
        listOfImportance = ["Smith", "El", "John", "Karl", "Peter"];
    } else {
        listOfImportance = ["John", "Peter", "Karl", "El", "Smith"];
    }

     for (let i = 0, orderLength = listOfImportance.length; i < orderLength; i++) {
         let currentOrder = listOfImportance[i];
         while (-1 != (j = $.inArray(currentOrder, arrayToSort))) {
             result.push(arrayToSort.splice(j, 1)[0]);
         }
         return result.concat(arrayToSort);
     }
}

问题是,如果data_response(因此服务器的结果)是["Peter", "John"] sortActions(data_response, true)的结果是["Peter", "John"],那么没有正确排序。实际上,预期结果将是:["John", "Peter"]

问题可能是服务器响应不包含重要性列表中的所有项目?

1 个答案:

答案 0 :(得分:2)

我认为你的问题就在于行

     return result.concat(arrayToSort);

这应该在函数的for,last行之外,以便在可以排序的所有内容都被排序后才添加剩余的项目。

但是,我建议你不要重新发明轮子,并使用语言中的默认排序功能。首先,使用优先级函数映射元素,如下所示:

return array.sort((a, b) => priority(a) - priority(b));

优先级函数是一个将元素映射到它的优先级(整数)的函数,例如,

const priority = el => listOfImportance.indexOf(el);

将按数组中指定的顺序排序;第一个元素将是优先级0,结果中的第一个元素,第二个元素将是优先级1,依此类推。