排序字符串数组,使用另一个字符串数组来确定顺序

时间:2015-12-11 02:29:55

标签: javascript arrays string sorting

我正在尝试对字符串数组进行排序,使用另一个字符串数组来确定第一个字符串的顺序。对于下面的函数,我修改了一个典型的排序函数。我认为它工作正常,除非它试图处理具有多个第一个字母实例的数组;然后它认为它们是变量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);

谢谢!

1 个答案:

答案 0 :(得分:2)

一种方法是遍历数组,在orderRequired数组中找到索引,使用索引构建排序数组,并在orderRequired中将索引归零:

&#13;
&#13;
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;
&#13;
&#13;

希望有所帮助。