You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何根据另一个数组对二维数组进行排序?

如何根据另一个数组对二维数组排序?

问题示例

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 20:37:43