关于用友网络秋季校招一个前端题目的分析

@GuoYongfeng 2017-10-17 05:17:57发表于 iuap-design/blog

首先声明,这是用友网络秋季校招一个前端笔试题,题目的大意是,给下列对象按属性个数进行升序排序。

var a = {aa: 22, bb: 'yonyou FED Team'};
var b = {cc: 32, };
var c = {ee: 11, ff: 'tinper', dd: 'iuap'};

分析与思考

题目本身不难,考察的点很基础但也是非常有价值的,涉及两个方面,一个是如何获取对象属性的个数,两一个点是如何手写升序排序的基本算法。

分析完后再看,其实每个点都有很多种解决的思路。

如何获取对象的属性个数

如何获取属性个数,方法挺多:

  1. 调用 Object.keys
var lenOfObjA = Object.keys( a ).length
  1. 调用 Object.hasOwnPropertyNames
var lenOfObjB = Object.getOwnPropertyNames( b ).length
  1. 使用对象的 hasOwnProperty
function attributeCount(obj) {
   var num = 0;
    for(let i in obj) {
        if(obj.hasOwnProperty(i)) {  
            num++;
        }
    }
    return num;
}

如果更优一点,可以改善一下,加分项;

Object.prototype.count = function(){
	var __count__ = Object.prototype.hasOwnProperty('__count__');
	if(__count__){
		return this.__count__;
	} else {
		var count = 0;
	    for (var i in this) if (this.hasOwnProperty(i)) {
	      count ++;
	    }
	    return count;
	}
}

对获得的结果排序

这就是个老生常谈的问题,也是这个题目中的第一个得分项。当然,我们希望看到各种原生手写的排序算法,性能越优越好。以下是快排示例:

function quickSort(arr) {
  if (arr.length <= 1) { return arr; }
  var pivotIndex = Math.floor(arr.length / 2);
  var pivot = arr.splice(pivotIndex, 1)[0];
  var left = [];
  var right = [];
  for (var i = 0; i < arr.length; i++){
    if (arr[i] < pivot) {
      left.push(arr[i]);
    } else {
      right.push(arr[i]);
    }
  }
  return quickSort(left).concat([pivot], quickSort(right));
};

按照题目要求,还应该对这个方法进行扩展,增加降序还是升序的参数来进行控制。