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.a5. 插入大量的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;
}