Quiero ordenar una matriz multidimensional por índice de varias columnas.
Por ejemplo, tengo debajo de los datos de prueba,
var source = [ ["Jack","A","B1", 4], ["AVicky","M", "B2", 2], ["AVicky","F", "B3", 3], ];Quiero ordenar la fuente según el índice de la columna dinámica, como en algún momento quiero ordenar según el primero + segundo, la próxima vez, es posible que desee ordenar por primero + segundo + tres.
Actualmente, probé el código a continuación, pero solo se ordenará según el índice de columna específico.
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; }Tu puedes hacer:
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; }