我正在尝试针对'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处浏览了几乎所有的解决方案,并且没有一个处理基于具有不匹配的项目数量并对索引值===
索引值进行排序而将数组排序到另一个数组。其他解决方案处理密钥,或根据字母(或基于数字的字母)等对数字进行排序等。
我感谢有人能提供的任何帮助,即使只是指出我正确的方向,所以我可以解决这个问题。
答案 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
的散列图。