我想按多列索引对多维数组进行排序.

例如,我有以下测试数据,

var source = [
  ["Jack","A","B1", 4],
  ["AVicky","M", "B2", 2],
  ["AVicky","F", "B3", 3],
];

我想根据动态列索引对源代码进行排序,比如有时我想根据第一+第二进行排序,下次,我可能想按照第一+第二+第三进行排序.

目前,我try 了下面的代码,但它只会根据特定的列索引进行排序.

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; }

Javascript相关问答推荐

如何使用JavaScript用等效的功能性HTML替换标记URL格式?

Google图表时间轴—更改hAxis文本 colored颜色

Snowflake JavaScript存储过程返回成功,尽管预期失败

Rehype将hashtag呈现为URL

无法访问Vue 3深度监视器中对象数组的特定对象值'

您能在卸载程序(QtInsteller框架)上添加WizardPage吗?

TypeError:无法分解';React2.useContext(...)';的属性';basename';,因为它为空

如何将innerHTML字符串修剪为其中的特定元素?

Rxjs流中生成IMMER不能在对象上操作

如何在DYGRAPS中更改鼠标事件和键盘输入

与svg相反;S getPointAtLength(D)-我想要getLengthAtPoint(x,y)

JS Animate()方法未按预期工作

WebSocketException:远程方在未完成关闭握手的情况下关闭了WebSocket连接.&#三十九岁;

如何找到带有特定文本和测试ID的div?

用Reaction-RT-Chart创建实时条形图

递增/递减按钮React.js/Redux

JavaScript:多个图像错误处理程序

使用Java脚本替换字符串中的小文本格式hashtag

带元素数组的Mongo聚合

Node.js的Fetch()调用总是创建新的Express会话