如何使用另一个数组作为模板对数组数据进行排序?

时间:2016-06-17 14:26:34

标签: javascript jquery arrays sorting

我正在尝试针对'master'数组对动态生成的JavaScript数组进行排序。此主数组将用作如何对动态生成的数组进行排序的模板。但是,主数组可能会在将来添加新项目,但这些项目将手动添加。

需要排序的数组是:

var arrayToSort = ['ABCD','ABCD 123 Team','IMT_User_MNOP'];

主数组是:

var roleDef = ['IMT_User_MNOP','IMT_User_User','ABCD','ABCD 123 Team','ABCD Plans'];

我在SO处浏览了几乎所有的解决方案,并且没有一个处理基于具有不匹配的项目数量并对索引值===索引值进行排序而将数组排序到另一个数组。其他解决方案处理密钥,或根据字母(或基于数字的字母)等对数字进行排序等。

我感谢有人能提供的任何帮助,即使只是指出我正确的方向,所以我可以解决这个问题。

4 个答案:

答案 0 :(得分:1)

我建议使用哈希表作为所需排序顺序,默认值为未定义的值应该从开始到结束。

{
    "IMT_User_MNOP": 1,
    "IMT_User_User": 2,
    "ABCD": 3,
    "ABCD 123 Team": 4,
    "ABCD Plans": 5
}



var arrayToSort = ['ABCD', 'ABCD 123 Team', 'IMT_User_MNOP'],
    roleDef = ['IMT_User_MNOP', 'IMT_User_User', 'ABCD', 'ABCD 123 Team', 'ABCD Plans'],
    roleObj = Object.create(null);

roleDef.forEach(function (a, i) { roleObj[a] = i + 1; });

arrayToSort.sort(function (a, b) {
    return (roleObj[a] || 0) - (roleObj[b] || 0);
});

console.log(arrayToSort);




答案 1 :(得分:1)

var arrayToSort = ['ABCD','ABCD 123 Team','IMT_User_MNOP'];
var roleDef = ['IMT_User_MNOP','IMT_User_User','ABCD','ABCD 123 Team','ABCD Plans'];


var newArr = arrayToSort.map(function(item){
  var idx = roleDef.indexOf(item);
  
  return {
    val:item,
    roleDefIndex:idx
  };
});
var result = newArr.sort(function(a, b) {
  return a.roleDefIndex - b.roleDefIndex;
}).map(function(item){
  return item.val;
});
console.log(result);

其他版本

var arrayToSort = ['ABCD','ABCD 123 Team','IMT_User_MNOP'];
var roleDef = ['IMT_User_MNOP','IMT_User_User','ABCD','ABCD 123 Team','ABCD Plans'];

var IndexWithinRole = {};
 arrayToSort.forEach(function(item){
  IndexWithinRole[item] = roleDef.indexOf(item);
});
arrayToSort.sort(function(a, b) {
  return IndexWithinRole[a] - IndexWithinRole[b];
});
console.log(arrayToSort);

答案 2 :(得分:0)

我只是这样做但是没有时间检查它是否愚蠢



var arrayToSort = ['ABCD','ABCD 123 Team','IMT_User_MNOP'],
        roleDef = ['IMT_User_MNOP','IMT_User_User','ABCD','ABCD 123 Team','ABCD Plans'];
arrayToSort.sort((a,b) => roleDef.indexOf(a) - roleDef.indexOf(b));
console.log(arrayToSort);




答案 3 :(得分:0)

如果您要使用产生 O(n²)解决方案的Array.indexOf(),请使用:

var roleDef = ['IMT_User_MNOP','IMT_User_User','ABCD','ABCD 123 Team','ABCD Plans'];
var arrayToSort = ['ABCD','ABCD 123 Team','IMT_User_MNOP'];

var sorted = roleDef.filter(role => arrayToSort.indexOf(role) >= 0);

console.log(sorted);

如果您需要更大的阵列性能,请使用@ NinaScholz的答案并预先计算roleDef的散列图。