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):
- 把B转成
Set,自动去重同时实现快速查找 - 过滤A中存在于B集合的元素
- 再用
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
相关产品推荐
相关产品推荐

