I want to sort multidimensional array by multiple column index.
For example, I have below test data,
var source = [
["Jack","A","B1", 4],
["AVicky","M", "B2", 2],
["AVicky","F", "B3", 3],
];
I want to sort source based on dynamic column index, like sometime I want to sort based on first+second, next time, I may want to sort by first+second+three.
Currently, I tried code below, but, it will only sort based on specific column index.
var source = [
["Jack","A","B1", 4],
["AVicky","M", "B2", 2],
["AVicky","F", "B3", 3],
];
var target = [
["Tom","M", "B3", 2],
["Jack","F", "B1", 1],
["Cindy","F", "B3", 3],
];
var keyIndexs = [0,1];
var same = [];
//order rows
var sourceOrder = source
keyIndexs.forEach(i => sourceOrder = sortByColumn(sourceOrder, i)) ;
console.log(sourceOrder);
for(var i = 0; i < source.length; i ++){
//console.log(ContainsRow(source[i], target));
if(ContainsRow(source[i], target)){
same.push(source[i]);
}
}
console.log(same);
function CompareRow(source:any[], target:any[]):boolean{
return JSON.stringify(source) === JSON.stringify(target);
}
function ContainsRow(source:any[], target: any[][]):boolean{
for(var i = 0; i <target.length; i ++){
if(CompareRow(source, target[i])){
return true;
}
}
return false;
}
function sortByColumn(a, colIndex){
a.sort(sortFunction);
function sortFunction(a, b) {
if (a[colIndex] === b[colIndex]) {
return 0;
}
else {
return (a[colIndex] < b[colIndex]) ? -1 : 1;
}
}
return a;
}