jQuery按多个值对数组排序(加权)

时间:2018-08-08 15:00:42

标签: javascript jquery

我有一个像下面这样的多维数组,我想做一些花哨的排序,但是我不确定如何处理它。我想先按第5个元素,然后按第4个,然后按第3个,然后按第2个,然后按第1个(不包括第0个元素-即名称)对数组元素进行排序。

基本上加权排序。稍后我可能需要进行相反的排序(按第1,第2,然后第3,然后第4,然后第5的顺序排序)。

arr[0]["Array Name 1", 0, 0, 0, 0, 0]
arr[1]["Array Name 2", 0, 0, 0, 5, 2]
arr[2]["Array Name 3", 97, 0, 0, 6, 50]
arr[3]["Array Name 4", 97, 0, 0, 0, 0]
arr[4]["Array Name 5", 96, 0, 0, 0, 12]
arr[5]["Array Name 6", 97, 2, 0, 0, 2]
arr[6]["Array Name 7", 97, 3, 0, 0, 0]
arr[7]["Array Name 8", 96, 0, 0, 4, 1]
arr[8]["Array Name 9", 96, 0, 1, 0, 0]
arr[9]["Array Name 10", 96, 0, 1, 1, 0]

我希望这是有道理的,我发现我可能需要进行比较,即

var arr = [40, 100, 1, 5, 25, 10];
points.sort(function(a, b){return a - b});

但是我找不到适合我的用例的东西。

2 个答案:

答案 0 :(得分:2)

您可以取值的一个子集并反转临时数组。然后对值增量进行短路迭代。

var array = [["Array Name 1", 0, 0, 0, 0, 0], ["Array Name 2", 0, 0, 0, 5, 2], ["Array Name 3", 97, 0, 0, 6, 50], ["Array Name 4", 97, 0, 0, 0, 0], ["Array Name 5", 96, 0, 0, 0, 12], ["Array Name 6", 97, 2, 0, 0, 2], ["Array Name 7", 97, 3, 0, 0, 0], ["Array Name 8", 96, 0, 0, 4, 1], ["Array Name 9", 96, 0, 1, 0, 0], ["Array Name 10", 96, 0, 1, 1, 0]];

array.sort((a, b) => {
   var aa = a.slice(1).reverse(),
       bb = b.slice(1).reverse(),
       delta;
       
   aa.some((v, i) => delta = v - bb[i]);
   return delta;
});

console.log(array.map(a => a.join(' ')));
.as-console-wrapper { max-height: 100% !important; top: 0; }

答案 1 :(得分:0)

首先请注意,这不是加权。它只是按多个条件排序。

要达到您的要求,我建议创建一个函数进行比较,然后将索引传递给该函数。然后,您可以在值相等时递归调用此函数以减少每次调用的索引。该函数将向sort()处理程序返回一个值,该值指示如何处理当前元素的索引。像这样:

var arr = [["Array Name 1", 0, 0, 0, 0, 0], ["Array Name 2", 0, 0, 0, 5, 2], ["Array Name 3", 97, 0, 0, 6, 50], ["Array Name 4", 97, 0, 0, 0, 0], ["Array Name 5", 96, 0, 0, 0, 12], ["Array Name 6", 97, 2, 0, 0, 2], ["Array Name 7", 97, 3, 0, 0, 0], ["Array Name 8", 96, 0, 0, 4, 1], ["Array Name 9", 96, 0, 1, 0, 0], ["Array Name 10", 96, 0, 1, 1, 0]];

arr.sort(function(a, b) {
  return doSort(a, b)
});

function doSort(a, b, i) {
  i = i || a.length - 1;
  var diff = a[i] - b[i];
  if (diff == 0)
    diff = doSort(a, b, --i);        
  return diff;  
}

console.log(arr);