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

JS数组排序及无嵌套循环实现指定数组构建问题

问题需求
  • 构建数组C:包含数组A和B中索引与值均完全相同的元素(示例:A=[a,b,c], B=[c,b,a] → C=[b])
  • 构建数组D:包含A中存在于B内的唯一值(示例:A=[d,a,b,c], B=[c,b,a,a] → D=[a,b,c])
  • 要求:尽量避免嵌套循环,已实现C的构建,请教D的填充方法,同时想了解JS数组的排序方法

一、无嵌套循环实现数组C和D

数组C的优化实现

你原来的循环逻辑可以用Array.prototype.filter简化,不用手动写for循环,效率和无嵌套循环一致:

const A = ['a', 'b', 'c'];
const B = ['c', 'b', 'a'];
const C = A.filter((val, index) => val === B[index]);
// 输出:['b']

数组D的实现

要避开嵌套循环,核心是用Set把B转成集合——集合的元素查找是O(1)时间复杂度,整体流程复杂度为O(n):

  1. 把B转成Set,自动去重同时实现快速查找
  2. 过滤A中存在于B集合的元素
  3. 再用Set去重A中符合条件的元素,最后转回数组(如果A本身没有重复值,这步可以省略)
const A = ['d', 'a', 'b', 'c'];
const B = ['c', 'b', 'a', 'a'];
const bSet = new Set(B);
// 完整写法(兼容A有重复值的情况)
const D = [...new Set(A.filter(val => bSet.has(val)))];
// 输出:['a', 'b', 'c']

// 若A本身无重复值,可简化为:
// const D = A.filter(val => bSet.has(val));

二、JS数组排序方法:Array.prototype.sort()

注意:默认排序坑

sort()默认会把所有元素转成字符串,再按Unicode码点排序,所以直接用在数字上会出问题:

const nums = [10, 2, 5];
nums.sort(); // 输出:[10, 2, 5],因为字符串'10'的Unicode码点比'2'小

自定义排序规则

必须传入一个比较函数(a, b) => {...},返回值决定排序顺序:

  • 返回负数:a排在b前面
  • 返回正数:b排在a前面
  • 返回0:两者位置不变

1. 数字排序

const nums = [10, 2, 5];
// 升序
nums.sort((a, b) => a - b); // 输出:[2, 5, 10]
// 降序
nums.sort((a, b) => b - a); // 输出:[10, 5, 2]

2. 对象属性排序

const users = [
  { name: 'Bob', age: 25 },
  { name: 'Alice', age: 30 },
];
// 按age升序排列
users.sort((a, b) => a.age - b.age);
// 按name的自然字符串顺序排列(支持多语言)
users.sort((a, b) => a.name.localeCompare(b.name));

3. 稳定排序

从ES2019开始,sort()是稳定排序——排序键相同的元素,会保持原数组中的相对位置。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 10:24:08