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;
}
CodePudding user response:
You can do:
const sortCompareFn = sortArr => (a, b) => {
const getValue = v => sortArr.reduce((a, c) => a v[c], '')
const aValue = getValue(a)
const bValue = getValue(b)
return typeof aValue === 'string'
? aValue.localeCompare(bValue)
: aValue - bValue
}
const source = [
["Jack","A","B1", 4],
["AVicky","M", "B2", 2],
["AVicky","F", "B3", 3],
]
const sortArr1 = [1]
const result1 = source.sort(sortCompareFn(sortArr1))
console.log('result1:', result1)
const sortArr23 = [2, 3]
const result23 = source.sort(sortCompareFn(sortArr23))
console.log('result23:', result23)
const sortArr3 = [3]
const result3 = source.sort(sortCompareFn(sortArr3))
console.log('result3:', result3)
.as-console-wrapper { max-height: 100% !important; top: 0; }