为何先推入Object.keys至数组再排序无效?求解析原因
问题解析:对象键排序的两种写法差异原因
先把两种写法的代码逻辑还原,就能直观看到问题核心:
第一种无效写法的代码逻辑
const obj = { b: 1, a: 2 }; const keysArr = []; // 将Object.keys返回的键数组,作为单个元素推进keysArr keysArr.push(Object.keys(obj)); // 对外层的keysArr执行排序,但此时keysArr是 [ ['b', 'a'] ] keysArr.sort();
第二种有效写法的代码逻辑
const obj = { b: 1, a: 2 }; const keysArr = []; // 先对Object.keys返回的键数组原地排序,得到['a', 'b'] const sortedObjKeys = Object.keys(obj).sort(); // 把排好序的数组推进keysArr keysArr.push(sortedObjKeys);
核心差异点
- 数组嵌套的问题:第一种写法里,
push(Object.keys(obj))是把键数组当成keysArr的一个元素,最终keysArr是包含子数组的二维数组[ ['b', 'a'] ]。此时调用keysArr.sort()是对外层数组排序,但外层只有一个元素,排序等于没执行。 - 排序目标错误:你真正需要排序的是
Object.keys(obj)返回的键数组,而非外层的keysArr。如果想让第一种写法生效,应该改成对推进去的子数组排序:
keysArr.push(Object.keys(obj)); keysArr[0].sort(); // 此时keysArr[0]会变成['a', 'b']
- sort方法的特性:
sort()是原地修改数组的方法,第一种写法里你调用的是外层数组的sort,而非目标键数组的sort;第二种写法先对键数组执行sort,再把排好序的结果推进外层数组,自然得到正确结果。
内容的提问来源于stack exchange,提问作者Lukoooooooooo
相关产品推荐
相关产品推荐

