Я работал над этой проблемой весь день без хорошего решения. Google тоже мало помог. У меня есть сценарий, который должен принимать двумерный массив с неизвестным числом строк / столбцов. Сценарий также должен принимать одномерный массив, содержащий список столбцов для сортировки, и другой, содержащий порядок сортировки. Вызов будет выглядеть примерно так:
var orderList = {0,4,3,1};
var orderDir = {asc,desc,desc,asc};
dataArr = do2DArraySort(dataArr, orderList, orderDir);
Функция do2DArraySort должна вернуть массив dataArr, отсортированный по первому столбцу (в порядке возрастания), затем по пятому столбцу (в порядке убывания), затем по третьему (в порядке убывания) , затем по второму (в порядке убывания). Я смог сделать его на два уровня глубиной, используя приведенный ниже код, но он развалился, когда я попытался добавить третий столбец сортировки. Я понимаю почему, но не могу придумать хороший способ заставить это работать.
Есть стандартный способ сделать это? Может ли кто-нибудь указать мне в Интернете хороший сценарий, который я могу изучить и использовать в качестве шаблона? Или кто-нибудь может предложить модификацию моего кода, чтобы он работал?
Спасибо!
//appends an array content to the original array
function addToArray(originalArray, addArray) {
if (addArray.length != 0) {
var curLength = 0;
curLength = originalArray.length;
var maxLength = 0;
maxLength = curLength + addArray.length;
var itrerateArray = 0;
for (var r = curLength; r < maxLength; r++) {
originalArray[r] = addArray[itrerateArray];
itrerateArray++;
}
}
}
function do2DArraySort(arrayToBeSorted, sortColumnArray, sortDirectionArray) {
if (arrayToBeSorted == "undefined" || arrayToBeSorted == "null") return arrayToBeSorted;
if (arrayToBeSorted.length == 0) return arrayToBeSorted;
if (sortColumnArray.length == 0) return arrayToBeSorted;
tempArray = arrayToBeSorted;
var totalLength = sortColumnArray.length;
for(var m = 0; m < totalLength; m++) {
if (m == 0) {
doBubbleSort(tempArray, tempArray.length, sortColumnArray[m], sortDirectionArray[m]);
} else {
doMultipleSort(tempArray, sortColumnArray[m], sortColumnArray[m-1], sortDirectionArray[m]);
}
}
return tempArray;
}
//check if a value exists in a single dimensional array
function checkIfExists(arrayToSearch, valueToSearch) {
if (arrayToSearch == "undefined" || arrayToSearch == "null") return false;
if (arrayToSearch.length == 0) return false;
for (var k = 0; k < arrayToSearch.length; k++) {
if (arrayToSearch[k] == valueToSearch) return true;
}
return false;
}
//sorts an 2D array based on the distinct values of the previous column
function doMultipleSort(sortedArray, currentCol, prevCol, sortDirection) {
var resultArray = new Array();
var newdistinctValuesArray = new Array();
//finding distinct previous column values
for (var n = 0; n < sortedArray.length; n++) {
if (checkIfExists(newdistinctValuesArray, sortedArray[n][prevCol]) == false) newdistinctValuesArray.push(sortedArray[n][prevCol]);
}
var recCursor = 0;
var newTempArray = new Array(); var toStoreArray = 0;
//for each of the distinct values
for (var x = 0; x < newdistinctValuesArray.length; x++) {
toStoreArray = 0;
newTempArray = new Array();
//find the rows with the same previous column value
for (var y = 0; y < sortedArray.length; y++) {
if (sortedArray[y][prevCol] == newdistinctValuesArray[x]) {
newTempArray[toStoreArray] = sortedArray[y];
toStoreArray++;
}
} //sort the row based on the current column
doBubbleSort(newTempArray, newTempArray.length, currentCol, sortDirection);
//append it to the result array
addToArray(resultArray, newTempArray);
}
tempArray = resultArray;
}