这篇博客我感觉写的很不错:reduce的介绍及用法,下面是我个人的面试心得而已
昨天面试,对方当场给我出了道面试题,题目是这样的:
//将对象中的键按字母顺序排序后输出
let _obj = {
e:5,
a:9,
d:3
}
//输出结果应为:
{
a:9,
d:3,
e:5
}
这应该是属于开发中常见的需求(但是我从来没遇到过就很离谱),于是我原地思考,我的思路是这样:先将对象中的键值取出,对键值进行排序,之后再将排序后的键值返回到新的对象里。
技术点三个:1.从指定对象中取出键值 2.将取出的键值进行排序 3.将排序后的结果返回成新的对象
先看第一步,从指定对象中取出键值,当时我想到了for...of循环,但其实for..of只能遍历可迭代对象,普通对象不属于可迭代对象,因此这步我们不能使用for..of循环,可以用for..in循环获取对象中的键值或者使用Object.keys()将指定对象中的键值以数组返回:
let _obj = {
e:5,
a:9,
d:3
};
//1.for..in方法
let _arr = []
for (keys in _obj){
arr.push(keys)
}
//2.Object.keys()方法
Object.keys(_obj)
显然第二个方法更好用,我们就用Object.keys方法往下看。
第二步需要我们将取出的键值进行排序,我们已经用Object.keys获得了一个由_obj对象的键名组成的数组,我们接下来就是要对数组中的元素进行排序:
直接调用数组的sort()方法,默认按照ASCII编码对字母进行排序。
let _arr = Object.keys(_obj).sort()
排序后得到的结果为:
接下来就是第三步:设置一个新的对象将键返回并赋予对应的值:
let _obj = {
e: 5,
a: 9,
d: 3
};
let _arr = Object.keys(_obj).sort()
/*
sortObj:排序对象
@params:
arr:将原对象键的排序好的数组
obj:原对象
@return: 排序好的对象
by Zack on 2022-3-26
*/
function sortObj(arr, obj) {
let result = {}
arr.forEach(item => {
result[item] = _obj[item]
})
console.log(result);
return result
}
sortObj(_arr, _obj)
通过自己编写一个方法用来处理这样的需求(优化一下可以把将对象中提取键的方法也放入方法中,这边是因为分步所以没有写在方法里),这样就能得到排序后的新对象了,但是这只是我没有接触过reduce()的写法,下面是reduce()的写法:
let _obj = {
e: 5,
a: 9,
d: 3
};
let _arr = Object.keys(_obj).sort()
//reduce方法
let _result = arr.reduce((pre, cur) => {
pre[cur] = _obj[cur]
return pre
}, {})
console.log(_result);
效率更高,代码量更小,完全不明白自己没有早点了解到这个reudce(哭o(╥﹏╥)o)
看都看完了,我希望当面试官问你的时候,你的回答不会是:“reduce....是啥?”