JavaScript基于外部对象对数组排序失效原因及实现方法求解
问题原因
当前写法不生效的核心原因是sort的比较函数返回了无效值:
- 当元素不存在于
obj的键中时,obj[a]/obj[b]的取值为undefined - 布尔值和
undefined做减法运算结果为NaN,sort方法遇到NaN时会判定两个元素的排序优先级相等,保留原数组的相对顺序,因此最终输出和原数组完全一致。
正确实现
你需要先把两种情况的优先级转换成明确的数字值,存在对应truthy值的元素优先级更高:
arr = [1, 2, 3, 4, 5, 6] obj = { 4: true, 6: true } arr.sort((a, b) => { const aExists = !!obj[a] const bExists = !!obj[b] if (aExists && !bExists) return -1 if (!aExists && bExists) return 1 return 0 }) // 输出 [4,6,1,2,3,5]
也可以使用更简洁的写法:
arr.sort((a, b) => !!obj[b] - !!obj[a])
这里通过双感叹号将取值强制转换为布尔值后再参与运算,true会转成数字1,false转成0,运算结果为标准数字,sort可以正常识别排序优先级。
内容的提问来源于stack exchange,提问作者Ethan
相关产品推荐
相关产品推荐

