如何在JavaScript中按多维度优先级排序整数数组的数组
实现任意维度数组的字典序排序
没问题,这其实就是要实现按数组元素顺序依次比较的字典序升序排序,而且要适配任意长度的子数组,我直接给你JavaScript的实现,再讲清楚逻辑~
核心思路
利用JavaScript数组的sort()方法,自定义一个比较函数:遍历子数组的每个维度(和dimensions长度一致),依次比较对应位置的元素,直到找到第一个不相等的元素,返回两者的差值来决定排序顺序。这样不管dimensions是多长,只要boxes里的子数组长度匹配,就能通用。
JavaScript代码实现
const dimensions = [10, 6, 4]; let boxes = [ [1, 2, 1], [10, 2, 4], [4, 1, 1], [10, 2, 3] ]; // 自定义比较函数,实现多维度依次比较 const compareBoxes = (a, b) => { // 遍历每个维度索引 for (let i = 0; i < dimensions.length; i++) { // 找到第一个不相等的元素,返回差值(升序排序) if (a[i] !== b[i]) { return a[i] - b[i]; } } // 所有元素都相等时,保持原顺序 return 0; }; // 执行排序 boxes.sort(compareBoxes); console.log(boxes); // 输出结果:[ [1, 2, 1], [4, 1, 1], [10, 2, 3], [10, 2, 4] ]
代码解释
compareBoxes函数是排序的核心:它接收两个待比较的子数组a和b;- 循环每个维度的索引
i,因为题目保证boxes子数组长度和dimensions一致,所以用dimensions.length作为循环边界; - 一旦发现
a[i]和b[i]不相等,就返回a[i] - b[i]——这个差值会告诉sort()方法如何排序:如果差值为正,a会排在b后面;如果为负,b排在a后面; - 如果所有维度的元素都相等,返回0,保持两个元素在原数组中的相对顺序(利用了
sort()的稳定排序特性)。
伪代码版本
如果需要更通用的伪代码表述,大概是这样:
FUNCTION compareBoxes(a, b): FOR i FROM 0 TO length(dimensions) - 1: IF a[i] != b[i]: RETURN a[i] - b[i] RETURN 0 APPLY sort operation TO boxes array USING compareBoxes as the comparator
这个方案完全适配你说的任意长度dimensions的场景,测试下来和你给出的预期结果完全一致~
内容的提问来源于stack exchange,提问作者Mathieu Dhondt
相关产品推荐
相关产品推荐

