如何根据另一个数组对二维数组进行排序?
如何根据另一个数组对二维数组排序?
问题示例
const dataset = [ [ 'red', [{name: 'Apple car'}] ], [ 'blue', [{name: 'Toothpiece'}] ], [ 'orange', [{name: 'Sun'}] ], [ 'yellow', [{name: 'Cat'}] ], ] const order = ['blue', 'yellow', 'red', 'orange'] const sortedDataset = sortArrayBasedOnAnother(dataset, order) // 期望输出: // [ // [ 'blue', [{name: 'Toothpiece'}] ], // [ 'yellow', [{name: 'Cat'}] ], // [ 'red', [{name: 'Apple car'}] ], // [ 'orange', [{name: 'Sun'}] ], // ]
你的代码问题分析
你写的这段代码逻辑完全偏离需求:
function sortArrayBasedOnAnother(dataset, order) { return order.filter((value) => dataset[0].includes(value)) }
dataset[0]仅取了二维数组的第一个子数组,错误地认为所有分类标识都集中在这里filter返回的是order数组里的匹配元素,而非原dataset中的完整子数组,自然得不到目标排序结果
正确解法
解法1:利用Array.sort和indexOf
适合数据量不大的场景,直接通过元素在order中的索引值排序:
function sortArrayBasedOnAnother(dataset, order) { // 复制原数组避免修改原数据 return [...dataset].sort((a, b) => { // 比较两个子数组的第一个元素在order中的索引 return order.indexOf(a[0]) - order.indexOf(b[0]); }); }
解法2:用Map优化查找效率
如果数据量较大,indexOf的O(n)查找会拖慢性能,先把order转成索引映射表,将查找复杂度降到O(1):
function sortArrayBasedOnAnother(dataset, order) { const orderIndexMap = new Map(); order.forEach((item, idx) => orderIndexMap.set(item, idx)); return [...dataset].sort((a, b) => { return orderIndexMap.get(a[0]) - orderIndexMap.get(b[0]); }); }
解法3:直接按order顺序构建结果
如果需要严格按照order的顺序输出(同时自动过滤order中不存在于dataset的项),可以先把dataset转成Map,再遍历order生成结果:
function sortArrayBasedOnAnother(dataset, order) { const dataMap = new Map(dataset); // 遍历order,取出对应的子数组,过滤掉不存在的项 return order.map(key => [key, dataMap.get(key)]).filter(item => item[1] !== undefined); }
内容的提问来源于stack exchange,提问作者marielle
相关产品推荐
相关产品推荐

