今天学习时,突然想到一种新方法给数组排序,特此记录下来。
直接上代码:
const arr = [3, 4, 6, 7, 10, 2];
const obj = {};
arr.forEach(value => obj[value] = value);
const objKey = Object.keys(obj);
const arrUp = objKey.map(value => parseInt(value));
代码中,arr 是待排序数组,arrUp 是 arr 的升序数组,arrDown 是 arr 的降序数组,代码思路很简单,因为 Object.keys() 遍历对象属性时,首先遍历所有数值键,按照数值升序排列,所以将 arr 中的数值作为 obj 的属性,当执行 Object.keys(obj) 时,返回一个 '升序' 数组,但是这个数组中的成员都是字符串,所以最后用 parseInt 将字符串转为数字,就得到了 arr 的升序数组 arrUp。
代码验证:
那么用 Object.keys() 来实现数组排序,有意义吗?其实没意义,用 Object.keys() 来实现数组排序不涉及算法,不涉及算法的话,用数组的 sort 方法更简洁。
重要的是,知道 for...in、Object.keys(obj)、Object.getOwnPropertyNames(obj)、Object.getOwnPropertySymbols(obj)、Reflect.ownKeys(obj),这 5 种方法遍历对象的键名,都遵守同样的属性遍历的次序规则:
- 首先遍历所有数值键,按照数值升序排列。
- 其次遍历所有字符串键,按照加入时间升序排列。
- 最后遍历所有 Symbol 键,按照加入时间升序排列。