一道简单的面试题

记录面试

作者 Trekerz 日期 2017-11-30
一道简单的面试题

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) {
var value1 = o1.age; // 取出前后两个对象的age属性
var value2 = o2.age;
return value1 - value2; // 从小到达排序
});

那么按照这个思路,只要我们把flight对象转化为数组就可以用数组方法来对flight进行排序了。

由于对象天生长着一副键值对的模样,跟数组的模样有着很大的区别,所以在转化为数组时我们只能选择保留键或保留值。这里我们可以利用Object.keys(obj)(为何不用for...in...呢?因为用for...in...遍历对象时与遍历数组时一样,都会在尾部多出一项)方法来把键存入数组,当后面我们需要获得其值时,只需使用方括号语法来访问原嵌套对象即可。以下是思路的实现:

var arr = Object.keys(flight);

arr.sort(function (o1,o2) {
var value1 = flight[o1].price; // 使用方括号语法访问对象的值
var value2 = flight[o2].price;
return value1 - value2;
});

这样就可以深入内层对象,对内层对象进行排序后再映射回外层键名了。

最后贴出整体代码:

function printFlightAndPrice(objData) {
var arr = Object.keys(objData);

arr.sort(function (o1,o2) {
var v1 = objData[o1].price;
var v2 = objData[o2].price;
return v1 - v2;
});

var output = '';
for (var i=0;i<arr.length;i++){
output += arr[i] + ':' + objData[arr[i]].price + '<br/>';
}
document.getElementById('output').innerHTML = output;
}

printFlightAndPrice(flight);

浏览器显示的结果如下:

CA109D:150

MQ389C:180

MU234A:235

SZ737M:300

AW090B:310


end -