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

如何依据另一数组的关联数值对目标数组进行排序?

解决方案

你的代码核心问题是sort回调需要返回**数字(正/负/0)**来定义排序逻辑,但你返回的是过滤后的数组,完全不符合排序函数的要求。另外每次排序都用filter查找效率极低,推荐先把arr2转成name到number的映射表,再高效排序。

1. 构建name与number的映射表

用reduce把arr2转换成键为name、值为对应number的对象,这样查找对应值的时间复杂度是O(1):

const nameNumberMap = arr2.reduce((map, item) => {
  map[item.name] = item.number;
  return map;
}, {});

2. 对arr1进行排序

在sort回调中,通过name从映射表取出number,比较两个值的差值即可实现按number升序排序:

arr1.sort((a, b) => nameNumberMap[a.name] - nameNumberMap[b.name]);

完整可运行代码

const arr1 = [{mood: "good", name: "Jake"}, {mood: "good", name: "Jill"}, {mood: "good", name: "Jack"}];
const arr2 = [{number: 2, name: "Jake"}, {number: 1, name: "Jill"}, {number: 3, name: "Jack"}];

// 构建映射表
const nameNumberMap = arr2.reduce((map, item) => {
  map[item.name] = item.number;
  return map;
}, {});

// 执行排序
arr1.sort((a, b) => nameNumberMap[a.name] - nameNumberMap[b.name]);

console.log(arr1);
// 输出:
// [{mood: "good", name: "Jill"}, {mood: "good", name: "Jake"}, {mood: "good", name: "Jack"}]

边界情况处理

如果arr1中存在arr2没有的name,可以给这类项设置默认值(比如放到排序末尾):

arr1.sort((a, b) => {
  const numA = nameNumberMap[a.name] ?? Infinity;
  const numB = nameNumberMap[b.name] ?? Infinity;
  return numA - numB;
});

内容的提问来源于stack exchange,提问作者soobnaibot

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 09:07:15