我有一个像下面这样的多维数组,我想做一些花哨的排序,但是我不确定如何处理它。我想先按第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});
但是我找不到适合我的用例的东西。
答案 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);