11月29日去面试,遇到了一道比较常见的面试题,当时因为忘了一个知识点而没做出来,想想可能是因为昨晚没睡好,导致一整天都有点魂不守舍。反正回来之后自己整理了一下,一下子就做出来了。以下是题目解答以及扩展。
题目:这是一个有关航班号和对应价格的嵌套对象,要求按照价格从低到高排序,并输出到DOM中。
> var flight = {
> 'MU234A':{'price':235},
> 'MQ389C':{'price':180},
> 'AW090B':{'price':310},
> 'CA109D':{'price':150},
> 'SZ737M':{'price':300}
> };
>
一道典型的按对象属性值进行排序的题目,不过有点不一样——平常我们遇到的是一个对象数组,而这道题的已知是一个嵌套对象。那么对于对象数组,我们之前是怎么处理的呢?比如,这里有个对象数组需要排序:
> var arr = [
> {'name':'Alice','age':20},
> {'name':'Bob','age':22},
> {'name':'Cindy','age':21},
> {'name':'Dan','age':23}
> ];
>
因为是数组,我们就可以直接用数组的sort()
方法来排序,只要给sort()
传入一个排序规则函数即可:
arr.sort(function (o1,o2) { |
那么按照这个思路,只要我们把flight
对象转化为数组就可以用数组方法来对flight
进行排序了。
由于对象天生长着一副键值对的模样,跟数组的模样有着很大的区别,所以在转化为数组时我们只能选择保留键或保留值。这里我们可以利用Object.keys(obj)
(为何不用for...in...
呢?因为用for...in...
遍历对象时与遍历数组时一样,都会在尾部多出一项)方法来把键存入数组,当后面我们需要获得其值时,只需使用方括号语法来访问原嵌套对象即可。以下是思路的实现:
var arr = Object.keys(flight); |
这样就可以深入内层对象,对内层对象进行排序后再映射回外层键名了。
最后贴出整体代码:
function printFlightAndPrice(objData) { |
浏览器显示的结果如下:
CA109D:150
MQ389C:180
MU234A:235
SZ737M:300
AW090B:310