如何在Javascript中按列对二维数组进行排序?
比如我有这个二维数组,也就是表格形式的JSON数组,我想按列排序:
var matriz = [
//Columnas: 0 1 2 3 4
/*Filas: 0*/ [9,5,3,2,7],
/* 1*/ [7,9,5,4,3],
/* 2*/ [8,4,6,0,1]
]
访问元素array[2][4]
返回 us 1
,即 row 2
, column 4
。
我想要做的是排序,例如 column 3
,但不改变每一行的顺序,它看起来像这样:
var matriz = [
//Columnas: 0 1 2 3 4
/*Filas: 0*/ [8,4,6,0,1]
/* 1*/ [9,5,3,2,7],
/* 2*/ [7,9,5,4,3],
]
为了对数组进行排序,我使用二进制搜索。这种类型的搜索导致在应用于有序序列的尽可能少的步骤中找到一个值。比如我想从100个数字中找出66,我首先说总数的一半,也就是我问是不是50,答案是:“不,是大于 50",那我问平均在 50 到 100 之间,也就是是 75 吗?不,是不是少了,以此类推。
我正在寻找66,我越来越接近... 100 50 75 62 68 65 66。这类似于我们在纸质词典中查找单词时不自觉地做的事情,没有人逐页查找,而是越来越近。
我对矩阵的排序是,首先我声明一个空矩阵,然后按顺序插入每一行。这样,在不改变每一行中的顺序的情况下,对指示的列进行排序。
要插入一行,首先我寻找插入它的指示位置,即要插入的行将在矩阵的开头,或者在末尾,或者在另外两行之间。
此外,可以指示我是否要按降序对数组进行排序。否则,它将上升。该函数
compara
只是比较两个数字。esDescentente
如果第一个小于第二个,则返回 1,如果相等,则返回 0,如果第一个大于第二个,则返回 -1false
...true
,-1 为 1,反之亦然。代码:
在 JavaScript 中,您有一个函数
sort
可以对传递给它的数组元素进行排序(二维数组不仅仅是一个数组数组),并且可以将自定义比较函数作为参数。此函数将接收要比较的数组,因此只需要知道应该比较哪个列索引。然后,您可以通过简单的两步过程按列对矩阵进行排序:
sort
。像这样的东西(理想情况下,比较函数应该有某种先决条件以确保索引和数组有效):
改编阿尔瓦罗蒙托罗的回答,并没有完全说服我的是,变量
indiceOrdenacion
(在我的例子中,我命名它columna
)从无到有接收它。为了避免这种情况发生,我创建了一个生成该函数的函数compare
(我将其命名为compara
西班牙语)。该函数
genera_compara
有两个参数,一个是columna
,另一个是esDescendente
(一个布尔值),并返回一个函数。我留下一些例子:generar_compara(3,true )
带回function anonymous(a,b){return a[3]>=b[3]?1:-1}
generar_compara(4,false)
带回function anonymous(a,b){return a[4]>=b[4]?-1:1}
我还做了函数
ordenar
不是改变原始数组的值,而是复制它。代码: