最近看到的当面试题,非常简单。
就是有这么一个小明个对象,他家的是700的距离,然后有一些别的对象,一个数组,每个人他的家有一个数字,现在让你对这个数组进行排序。
离小明越近的它就排在前面,越远的就排在后面,就这么个意思,比方说王强就离小明最近是,因为701基本是最近的他就在前面,就这个意思。
就是让你写这个函数给你一个数组,然后给你一个小明就是一个目标的对象,当然对这个数组进行排序,排序后然后返回是吧?
这个代码好写的就是数组的排序嘛,
return arr.sort((a,b) => )
就是 arr.sort
传入两个数字a和b,但是你要注意这个 a和B它不是一个数字,它是两个对象,你要对这两个对象比较大小,那么怎么来比较?
你就要看他们离小明到底有多远是吧?离得越近得到排前边,离得越远得到排后边,所以说你需要一个辅助函数就计算离小明的距离,你给我一个对象,你再给我另一个目标对象。
function _dis(o1,o2) {
return Math.abs(o1.home - o2.home)
}
我要求这两个对象之间的距离,那么反过来是啥?就是两个后面相减是吧?求绝对值。好有了这么一个辅助函数过后,那这就简单了。
就是爱你小明的距离,然后减去B李晓明的距离是吧?那么这样子就程序排出来了
return arr.sort((a,b) => ) _dis(a,info) - _dis(b,info);
运行看一下你看就出来了是吧
王强排到最前面了
如果说你还要加一个属性,就把距离加上的话其实也很简单,你就这样写。你先来一个卖,先把这个距离算出来是吧?是不是多了一个属性了,那么多了一个属性你把它加到那个原对象里边就这样子这样子的话,那么每一个对象它就会多一个属性。
return arr.map((it) => ({ ...it, dis:_dis(it,info)}))
你看是不是多了一个距离,然后按照距离排序是不是也可以,对不对?
然后再来一个 sort
,按照 a.dis
减去 b.dis
来进行排序不就完了,对吧?效果都是完全一样的啊。
return arr
.map((it) => ({ ...it, dis:_dis(it,info)}))
.sort((a,b) => a.dis - b.dis)
完整的就是这样
let xm = {
name:'小明',
home:700,
};
let schoolfellow =[
{
name:'李华',
home:300,
},
{
name:'王强',
home:701,
},
{
name:'李树',
home:1500,
},
{
name:'王武',
home:1000,
},
];
/**
* 根据info的距离,为arr元素排序离info最近的元素,近的元素靠前
* @param {*} arr 源数据
* @param {*} info 排序参考对象
* /
function soit(arr,info) {
function _dis(o1,o2) {
return Math.abs(o1.home - o2.home)
}
//return arr.sort((a,b) => ) _dis(a,info) - _dis(b,info);
return arr
.map((it) => ({ ...it, dis:_dis(it,info)}))
.sort((a,b) => a.dis - b.dis)
}
let resArr = (schoolfellow,xm);
console.log(resArr);
本文共 630 个字数,平均阅读时长 ≈ 2分钟
评论 (0)