如何按多列索引对多维数组进行排序
How to sort multidimensional array by multiple column index
我想按多列索引对多维数组进行排序。
比如我有下面的测试数据,
var source = [
["Jack","A","B1", 4],
["AVicky","M", "B2", 2],
["AVicky","F", "B3", 3],
];
我想根据动态列索引对源进行排序,比如有时我想根据第一+第二排序,下次我可能想根据第一+第二+三排序。
目前,我尝试了下面的代码,但是,它只会根据特定的列索引进行排序。
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;
}
你可以这样做:
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; }
我想按多列索引对多维数组进行排序。
比如我有下面的测试数据,
var source = [
["Jack","A","B1", 4],
["AVicky","M", "B2", 2],
["AVicky","F", "B3", 3],
];
我想根据动态列索引对源进行排序,比如有时我想根据第一+第二排序,下次我可能想根据第一+第二+三排序。
目前,我尝试了下面的代码,但是,它只会根据特定的列索引进行排序。
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;
}
你可以这样做:
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; }