一些最近遇到的前端面试题

222 阅读2分钟

1.给一个数,给里面的相邻两个偶数之间加-

例: input: 12234456899
output: 12-234-456-899

```
function insertDash(num) {
    //先把数转成一个字符数组便于操作
    var arr = num.toString().split("");
    for (var i = 0; i < arr.length - 1; i++) {
        //遍历数组,如果找到相邻都是偶数,用splice插入数组相应位置。
        if (Number(arr[i]) % 2 === 0 && Number(arr[i+1]) % 2 === 0) {
            arr.splice(i+1, 0, "-");
        }
    }
    return arr.join("");
}


output :"12-234-456-899"
```

2.实现一个类似promise all 的方法,输入是一个tasks数组,数组里面每个值用setTimeout模拟ajax call,当全部task完成时候返回所有tasks的值,顺序的和输入一样。

function getResults(tasks, finalCallBack) {
    var results = [];
    var count = 0;
      tasks.map(function(task, index){
        function callback(err, result) {
            if (err) {
                finalCallBack(true, null);
            }
              results[index] = result;
              count++;
              if (count == tasks.length) {
                finalCallBack(false, results);
            }
        }
        task(callback);
    });
    return null;
}

//下面是call function的例子
getResults(
    [
        function task1 (callback) {
            setTimeout(function() {
              callback(null, "one");
            }, 200);
        },
          function task2 (callback) {
            setTimeout(function() {
              callback(null, "two");
            }, 100);
        }
    ],
      function(err, results) {
        if (err) {
            console.log("Unsuccessful load all itmes");
        } else {
            return results;
        }
    }
);

3.给一个review集合,要求根据所有review平均值的距离来排序。

例: "a" "bb" "cccc" "ddddd"
这个例子review平均长度3,按照离3最近的review来排序
"bb" "cccc" "a" "ddddd"


let arr = [{"name": "Leon", review: "this is first and also a very very very long test"},
           {"name": "Jack", review: "this is second test"},
           {"name": "Lucy", review: "this is third test"},
           {"name": "Tim", review: "test"},
           {"name": "Kevin", review: "this test"}];


function getAvg(arr) {
      let sum = 0;
    arr.map((obj)=>{
        sum += obj.review.length;
    });
      return sum/arr.length;
}


function sortByDis(arr) {
  let avg = getAvg(arr);
  //主要考察数据操作和排序
  arr.sort((obj1, obj2)=>{
    let len1 = Math.abs(obj1.review.length - avg);
    let len2 = Math.abs(obj2.review.length - avg);
      return len1 > len2;
  });
  console.log(arr);
}

sortByDis(arr);

4. 给出代码,说出输出结果,如何改正。

var Foo = function( a ) {
    function bar() {
        return a;
    }
    this.baz = function() {
        return a;
    };
};
Foo.prototype = {
    biz: function() {
        return a;
    }
};
var f = new Foo( 7 );
f.bar(); // error, undefined 把方法改为baz一样,才能被实例继承    
f.baz(); // 7
f.biz(); // undefined       把a改成this.a

5. 插入大量的DOM, 考的是优化插入操作,避免浏览器回流。

for (var i = 0; i < 1000; i++) {
    var el = document.createElement('p');
    el.innerHTML = i;
    document.body.appendChild(el);
}

//可以替换为:
var frag = document.createDocumentFragment();
for (var i = 0; i < 1000; i++) {
    var el = document.createElement('p');
    el.innerHTML = i;
    frag.appendChild(el);
}
document.body.appendChild(frag);

6. 如下,给出一个endorsements数组包含一系列数据,要求按照技能合并用户名,并给出count。

count数据个数是hash表常用的情景,这里我们用一个对象来模拟hash,skill => {skill, user, count}

Input
var endorsements = [
{ skill: 'javascript', user: 'Chad' },
{ skill: 'javascript', user: 'Bill' },
{ skill: 'css', user: 'Sue' },
{ skill: 'javascript', user: 'Sue' },
{ skill: 'css', user: 'Bill' },
{ skill: 'html', user: 'Sue' }
];

Result
[
{ skill: 'javascript', user: [ 'Chad', 'Bill', 'Sue' ], count: 3 },
{ skill: 'css', user: [ 'Sue', 'Bill' ], count: 2 },
{ skill: 'html', user: [ 'Sue' ], count: 1 }
];

function mergeUser(endorse) {
  var map= {};
  var result = [];
  for(var i = 0; i < endorse.length; i ++){
    var skill = endorse[i].skill;
    var user = endorse[i].user
    if(typeof map[skill] === 'undefined') {
      map[skill] = {skill: skill, user: [], count: 0 };
    }
    map[skill].user.push(user);
    map[skill].count ++;
    result.push(map[skill]);
  }
  return result;
}

console.log(mergeUser(endorsements));

7. 给你一个有参数url:"google.com?q1=v1&q2=v2#xxx”

写一个方返回{q1: 'v1', q2: 'v2'}, 要用到decodeURL();

function getParameters(url){
    var sb = decodeURI(url);
    sb = url.slice(url.indexOf("?") + 1, url.indexOf("#")).split("&");
    var obj = {};
    for (var i = 0; i < sb.length; i++) {
        var para = sb[i].split("=");
        obj[para[0]] = para[1];
    }
    return obj;
}