如何在 TypeScript 中对二维数组进行排序?
在 TypeScript 中,二维数组是数组的数组,其中每个内部数组代表二维数组的一行。您可以使用括号访问数组的各个元素,行和列索引用逗号分隔。一维数组可以存储任何数据类型的值,例如字符串、数字、对象等。
要在 TypeScript 中对二维数组进行排序,可以使用 sort() 方法以及自定义的 compare 函数。sort() 方法将 compare 函数作为可选参数,而 compare 函数应接受两个参数 a 和 b,分别代表要比较的两个元素。如果 a 在 b 之前,则 compare 函数应返回负数;如果 a 在 b 之后,则返回正数;如果 a 和 b 相同,则返回 0。
开发过程中经常需要根据特定条件对二维数组的值进行排序。因此,我们将学习如何对二维数组进行行和列排序。
使用 array.sort() 方法对二维数组进行行排序
通常,我们使用 Array 类的 sort() 方法对数组进行排序,而不是创建自定义算法(例如合并排序或快速排序)。sort() 方法的实现时间和空间复杂度低于其他排序算法。
语法
要对二维数组进行行排序,我们必须将包含排序条件的回调函数作为 sort() 方法的参数传递。用户可以按照以下语法对二维数组进行行排序。
let arr: Array<Array<number>> = []; for (let i = 0; i < arr.length; i++) { arr[i].sort( (a, b) => { if (first === second) { return 0; } else { if (first < second) { return -1; } return 1; } }); }
在上面的语法中,我们遍历数组的每一行并对每一行分别进行排序。在 array.sort() 方法中,传递回调函数,该函数返回 0、-1 和 1,以便对数字进行相应的排序。
算法
步骤 1 − 创建名为"arr"的数字类型数组。
步骤 2 − 遍历矩阵的每一行,对每一行分别进行排序。
步骤 3 − 对每一行调用 sort() 方法。
步骤 4 − 将回调函数作为 sort() 方法的参数传递,该方法接受行的两个值作为参数。
步骤 5 − 比较两个参数值,并按升序或降序排序后,从回调函数中返回零、正数和负数。
示例
在下面的示例中,我们创建了一个二维数字数组,并推送了一些数字。我们使用 sort() 方法对每一行进行排序,回调函数根据其参数值的相等性返回 0、-1 和 1。
// 创建数字数组并插入值 let arr: Array<Array<number>> = []; arr.push([0, 4, 67, 32, 21, 11]); arr.push([56, 43, 32, 21, 45, 56]); arr.push([8, 98, 78, 41, 1, 2]); arr.push([3, 87, 8, 5, 4, 21]); // 对每一行单独排序 for (let i = 0; i < arr.length; i++) { arr[i].sort(sort_callback); } // sort 方法的回调函数,返回数字 function sort_callback(first: number, second: number): number { // 如果两个数字相等,则返回 0。这意味着数字的位置不会改变 if (first === second) { return 0; } else { // 如果第一个数字较小,则返回 -1,也不会交换数字 if (first < second) { return -1; } // 如果第一个数字大于第二个数字,则返回 1 来交换两个数字。 return 1; } } // 打印数组 console.log("按行排序后的数组:"); console.log(" "); console.log(arr);
编译后,它负责生成以下 JavaScript 代码 -
// 创建数字数组并插入值 var arr = []; arr.push([0, 4, 67, 32, 21, 11]); arr.push([56, 43, 32, 21, 45, 56]); arr.push([8, 98, 78, 41, 1, 2]); arr.push([3, 87, 8, 5, 4, 21]); // 对每一行单独排序 for (var i = 0; i < arr.length; i++) { arr[i].sort(sort_callback); } // 排序方法的回调函数,返回数字 function sort_callback(first, second) { // 如果两个数字相等,则返回 0。这意味着数字的位置不会改变 if (first === second) { return 0; } else { // 如果第一个数字较小,则返回 -1,也不会交换数字 if (first < second) { return -1; } // 如果第一个数字大于第二个数字,则返回 1 来交换两个数字。 return 1; } } // 打印数组 console.log("按行排序后的数组:"); console.log(" "); console.log(arr);
输出
以上代码将产生以下输出 -
按行排序后的数组: [ [ 0, 4, 11, 21, 32, 67 ], [ 21, 32, 43, 45, 56, 56 ], [ 1, 2, 8, 41, 78, 98 ], [ 3, 4, 5, 8, 21, 87 ] ]
在上面的输出中,用户可以观察到所有行都单独排序。
使用 array.sort() 方法对二维数组进行列排序
在上一部分中,我们学习了如何对数组进行行排序。现在,我们将学习如何对数组进行列排序。列排序意味着我们将根据任何特定的数组列对二维数组的行进行排序或交换。
语法
用户可以按照以下语法对二维数组进行列排序。
let arr: Array<Array<number>> = []; arr.sort( ( firstRow: Array<number>, secondRow: Array<number> ): number => { if (firstRow[2] === secondRow[2]) { return 0; } else { if (firstRow[2] < secondRow[2]) { return -1; } return 1; } }
在上述语法中,我们使用了 array.sort() 方法,并将箭头函数作为回调函数传递。箭头函数根据特定列的值返回正值和负值,sort() 方法则相应地对数组进行排序。
示例
根据第三列对数组进行排序
以下示例中使用 sort() 方法对二维数组进行列排序。sort() 方法的回调函数根据作为回调函数参数传递的任意两行第三个元素的比较结果,返回零值、正值和负值。
// 创建数组并使用值初始化它 let arr: Array<Array<number>> = [ [0, 4, 67, 32, 21, 11], [56, 43, 32, 21, 45, 56], [8, 98, 78, 41, 1, 2], [3, 87, 8, 5, 4, 21], ]; arr.sort(sort_columnWise); // 回调函数根据第三列对数组进行排序。 // 如果回调函数返回 1,sort() 方法将交换行,否则不交换。 function sort_columnWise( firstRow: Array<number>, secondRow: Array<number> ): number { if (firstRow[2] === secondRow[2]) { return 0; } else { if (firstRow[2] < secondRow[2]) { return -1; } return 1; } } // 打印数组 console.log("按第三列排序后的数组:"); console.log(" "); console.log(arr);
编译后,它将生成以下 JavaScript 代码 -
// 创建数组并用值初始化它 var arr = [ [0, 4, 67, 32, 21, 11], [56, 43, 32, 21, 45, 56], [8, 98, 78, 41, 1, 2], [3, 87, 8, 5, 4, 21], ]; arr.sort(sort_columnWise); // 回调函数根据第三列对数组进行排序。 // 如果回调函数返回 1,sort() 方法将交换行,否则不交换。 function sort_columnWise(firstRow, secondRow) { if (firstRow[2] === secondRow[2]) { return 0; } else { if (firstRow[2] < secondRow[2]) { return -1; } return 1; } } // 打印数组 console.log("按第三列排序后的数组:"); console.log(" "); console.log(arr);
输出
以上代码将产生以下输出 -
按第三列排序后的数组: [ [ 3, 87, 8, 5, 4, 21 ], [ 56, 43, 32, 21, 45, 56 ], [ 0, 4, 67, 32, 21, 11 ], [ 8, 98, 78, 41, 1, 2 ] ]
在输出中,用户可以观察到所有行都根据第三列的值进行了排序。
示例
在下面的示例中,我们创建了一个对象数组,其中包含员工姓名和入职年份。我们对该数组使用 sort() 方法,并根据作为回调函数参数传递的第一个对象和第二个对象的年份之差对所有对象进行排序。
let employee_Data: Array<{ name: string; joinedYear: number }> = [ { name: "Shubham", joinedYear: 2019 }, { name: "Jems", joinedYear: 2021 }, { name: "Bond", joinedYear: 2022 }, { name: "Akshay", joinedYear: 2017 }, { name: "sulabh", joinedYear: 2012 }, ]; // 根据对象的joinedYear属性对对象数组进行排序 employee_Data.sort((first, second) => { // 根据年份差值返回0、正值或负值 // 如果差值是正数,sort() 方法将交换对象,否则不交换。 // 如果用户希望按降序对数组进行排序,只需返回second.joinedYear - first.joinedYear return first.joinedYear - second.joinedYear; }); // 打印数组 console.log("根据 joindedYear 排序后的数组:"); console.log(" "); console.log(employee_Data);
编译后,它将生成以下 JavaScript 代码 -
var employee_Data = [ { name: "Shubham", joinedYear: 2019 }, { name: "Jems", joinedYear: 2021 }, { name: "Bond", joinedYear: 2022 }, { name: "Akshay", joinedYear: 2017 }, { name: "sulabh", joinedYear: 2012 }, ]; // 根据对象的joinedYear属性对对象数组进行排序 employee_Data.sort(function (first, second) { // 根据年份的差异返回0、正值或负值 // 如果差异为正,sort() 方法将交换对象,否则不交换。 // 如果用户希望按降序对数组进行排序,只需返回second.joinedYear - first.joinedYear return first.joinedYear - second.joinedYear; }); // 打印数组 console.log("根据joindedYear排序后的数组:"); console.log(" "); console.log(employee_Data);
输出
以上代码将产生以下输出 -
根据joindedYear排序后的数组: [ { name: 'sulabh', joinedYear: 2012 }, { name: 'Akshay', joinedYear: 2017 }, { name: 'Shubham', joinedYear: 2019 }, { name: 'Jems', joinedYear: 2021 }, { name: 'Bond', joinedYear: 2022 } ]