我正在尝试对字符串数组进行排序,使用另一个字符串数组来确定第一个字符串的顺序。对于下面的函数,我修改了一个典型的排序函数。我认为它工作正常,除非它试图处理具有多个第一个字母实例的数组;然后它认为它们是变量orderRequired
中该字母的第一个实例(尽管它们并非总是如此)。因此,它将它们并排分组,而不是我想要它们。
var orderRequired = ['b', 'c', 'a', 'd', 'b', 'e'];
//note orderRequired.indexOf('b') !== orderRequired.lastIndexOf('b');
var arr = ['apple', 'banana', 'biscuit', 'cabbage', 'doughnut', 'eclair'];
var myVar = sortThese(orderRequired, arr);
console.log(myVar);
// gives: ["banana", "biscuit", "cabbage", "apple", "doughnut", "eclair"]
// but I want: ["banana", "cabbage", "apple", "doughnut", "biscuit", "eclair"]
function sortThese(ordReq, arr){
return arr.sort(function sortFunction(a,b){
var indexA = ordReq.indexOf(a[0]);
var indexB = ordReq.indexOf(b[0]);
if(indexA < indexB) {
return -1;
}else if(indexA > indexB) {
return 1;
}else{
return 0;
}
});
}
如果它比较香蕉&#39;和饼干&#39;,arr
中最早的实例,也是结果中最早的实例。在上面的数组中有两个&#39; b&#39;单词,现在我很满意可以对这个数组进行排序的解决方案。一个完美的解决方案可能会排序3个或更多实例。例如,
var orderRequiredPartTwo = ['b', 'c', 'a', 'd', 'b', 'b', 'e']; // this has 3 'b's
var arrPartTwo = ['banoffee', 'apple', 'banana', 'biscuit', 'cabbage', 'doughnut', 'eclair'];
var myVarPartTwo = sortThese(orderRequiredPartTwo, arrPartTwo);
谢谢!
答案 0 :(得分:2)
一种方法是遍历数组,在orderRequired数组中找到索引,使用索引构建排序数组,并在orderRequired中将索引归零:
var orderRequired = ['b', 'c', 'a', 'd', 'b', 'b', 'e'];
var arr = ['banoffee', 'apple', 'banana', 'biscuit', 'cabbage', 'doughnut', 'eclair'];
var sortThese = function(orderReq, arr) {
var result = [];
for (var i = 0, t = arr.length; i < t; i++) {
var item = arr[i];
var index = orderReq.indexOf(item[0]);
result[index] = item;
orderReq[index] = null;
}
return result;
};
var sorted = sortThese(orderRequired, arr);
document.getElementById("result").innerHTML = JSON.stringify(sorted);
&#13;
<div id="result"></div>
&#13;
希望有所帮助。