如何依据另一数组的关联数值对目标数组进行排序?
解决方案
你的代码核心问题是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
相关产品推荐
相关产品推荐

