我有一个包含服务器检索的数据的字符串数组。我想根据元素的重要性对该数组进行排序。
这是我的代码:
// 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"]
问题可能是服务器响应不包含重要性列表中的所有项目?
答案 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,依此类推。