Я работаю над этой проблемой весь день без хорошего решения. Google тоже мало помог. У меня есть script, который должен принимать двухмерный массив с неизвестным числом строк/столбцов. script также должен принимать одномерный массив, содержащий список столбцов для сортировки, а другой - порядок сортировки. Вызов будет выглядеть примерно так:
var orderList = {0,4,3,1};
var orderDir = {asc,desc,desc,asc};
dataArr = do2DArraySort(dataArr, orderList, orderDir);
Функция do2DArraySort должна возвращать массив dataArr, отсортированный по первому столбцу (в порядке возрастания), затем по пятому (в порядке убывания), затем по третьему (в порядке убывания), затем по второму (в порядке убывания). Я смог сделать это на два уровня, используя код ниже, но он развалился, как только я попытался добавить третий столбец сортировки. Я понимаю, почему, но я не могу найти хороший способ заставить его работать.
Есть ли стандартный способ сделать это? Может ли кто-нибудь указать мне на хороший script онлайн, который я могу изучить и использовать в качестве шаблона? Или кто-то может предложить модификацию моего кода, чтобы он работал?
Спасибо!
//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;
}