牛客网 前端编程题小结
虽然是最最基础的js题,但是还是收获不少,大家都很聪明啊!
concat()、slice() map()不改变原数组
1.找出元素 item 在给定数组 arr 中的位置
如果数组中存在 item,则返回元素在数组中的位置,否则返回 -1
最基础版本:
function indexOf(arr,item){
for(var i=0;i<arr.length;i++){
if(arr[i]==item){
return i;
}
}
if (arr[arr.length]!=item) {
return -1;
}
}
foreach版本:
function indexOf(arr,item){
var i=-1;
arr.forEach( function(element, index) {
if (element==item) {
i=index;
}
});
return i;
}
document.write(indexOf([11,22,33,44],2));
indexof()版本:
function indexOf(arr,item){
return arr.indexOf(item);
}
document.write(indexOf([ 1, 2, 3, 4 ], 3));
2.计算给定数组 arr 中所有元素的总和 数组中的元素均为 Number 类型
foreach版本:
function sum(arr) {
var sum=0;
arr.forEach( function(element) {
sum+=element;
});
return sum;
}
document.write(sum([1,2,3,4,5]));
reduce版本:
function sum(arr) {
return arr.reduce(function (prev,cur) {
return prev+cur;
})
}
document.write(sum([1,2,3,4,5]));
evel版本:
function sum(arr) {
return eval(arr.join('+'));
}
document.write(sum([1,2,3,4,5]));
3.移除数组 arr 中的所有值与 item 相等的元素。不要直接修改数组 arr,结果返回新的数组
foreach版本:
function remove(arr,item) {
var i=[];
arr.forEach( function(element, index) {
if (element!=item) {
key=element;
i.push(key);
}
});
return i;
}
document.write(remove([1,2,3,4,5],2));
filter版本:
function remove(arr,item){
var res=arr.filter(function(i) {
return i!=item;
});
return res;
}
document.write(remove([1,2,3,4,5],2));
4.移除数组 arr 中的所有值与 item 相等的元素,直接在给定的 arr 数组上进行操作,并将结果返回
function removeWithoutCopy(arr, item) {
for (var i = 0; i < arr.length; i++) {
if (item==arr[i]) {
arr.splice(i,1);
i—;//数组会前移
}
}
return arr;
}
document.write(removeWithoutCopy([1,2,2,3,4,5,2,2],2));
5.在数组 arr 末尾添加元素 item。不要直接修改数组 arr,结果返回新的数组
function append(arr, item) {
return arr.concat(item);//push会改变原数组
}
document.write(append([1,2,2,3,4,5,2,2],888));
6.删除数组 arr 最后一个元素。不要直接修改数组 arr,结果返回新的数组
function truncate(arr) {
return arr.slice(0, -1);//arr.length-1
}
document.write(truncate([1,2,3,4]));
7.在数组 arr 开头添加元素 item。不要直接修改数组 arr,结果返回新的数组
function prepend(arr, item) {
return [item].concat(arr);
}
8.删除数组 arr 第一个元素。不要直接修改数组 arr,结果返回新的数组
function curtail(arr) {
return arr.slice(1);
}
document.write(curtail([1,2,3,4]));
9.合并数组 arr1 和数组 arr2。不要直接修改数组 arr,结果返回新的数组
function concat(arr1, arr2) {
return arr1.concat(arr2);
}
10.在数组 arr 的 index 处添加元素 item。不要直接修改数组 arr,结果返回新的数组
function insert(arr, item, index) {
return arr.slice(0, index).concat(item).concat(arr.slice(index));
}
11.统计数组 arr 中值等于 item 的元素出现的次数
最基础版本:
function count(arr, item) {
var i=0;
arr.forEach( function(element, index) {
if (element==item) {
i++;
}
// statements
});
return i;
}
document.write(count([1, 2, 4, 4, 3, 4, 3], 4));
改进版:
function count(arr, item) {
var i=0;
arr.forEach( function(element, index) {
element == item ? i++ :0;
});
return i;
}
document.write(count([1, 2, 4, 4, 3, 4, 3], 4));
filter版本:
function count(arr, item) {
return arr.filter(function(i) {
return i==item;
}).length;
}
12.找出数组 arr 中重复出现过的元素
function duplicates(arr) {
var a=[];
arr.forEach( function(element, index) {
if (element!=arr.lastIndexOf(element)&&a.indexOf(element)==-1) {
//防止新的数组有重复的数
a.push(element);
}
});
return a;
}
document.write(duplicates([1, 2, 4, 4, 3, 3, 1, 5, 3]));
filter版本:
function duplicate(arr){
return arr.sort().filter(function(element,index) {
return element==arr[index-1] && element!=arr[index+1];
});
}
document.write(duplicate([1, 2, 4, 4, 3, 3, 1, 5, 3]));
13.为数组 arr 中的每个元素求二次方。不要直接修改数组 arr,结果返回新的数组
function square(arr) {
var b=[];
arr.forEach( function(element, index) {
var i=0;
i=element*element;
b.push(i);
// statements
});
return b;
}
document.write(square([1, 2, 3, 4]));
map版本:
function square(arr) {
return arr.map(function(elem) {
return elem*elem;
})
}
document.write(square([1, 2, 3, 4]));
14.在数组 arr 中,查找值与 item 相等的元素出现的所有位置
最基础版本:
function findAllOccurrences(arr, target) {
var a=[];
for (var i = 0; i < arr.length; i++) {
if (arr[i]==target) {
a.push(i);
}
}
return a;
}
document.write(findAllOccurrences('abcdefabc'.split(''), ‘a'));
foreach版本:
function findAllOccurrences(arr, target) {
var temp=[];
arr.forEach( function(element, index) {
if (element==target) {
temp.push(index);
}
});
return temp;
}
foreach改进版:
function findAllOccurrences(arr, target) {
var temp=[];
arr.forEach( function(element, index) {
element!==target||temp.push(index);
});
return temp;
}
15.实现函数 functionFunction,调用之后满足如下条件:
1、返回值为一个函数 f
2、调用返回的函数 f,返回值为按照调用顺序的参数拼接,拼接字符为英文逗号加一个空格,即 ', '
3、所有函数的参数数量为 1,且均为 String 类型
function functionFunction(str) {
function f(s){
return str+", "+s;
}
return f;
}
document.write(functionFunction(‘Hello’)('world'));
两次调用函数,注意嵌套使用。
16.实现函数 makeClosures,调用之后满足如下条件:
1、返回一个函数数组 result,长度与 arr 相同
2、运行 result 中第 i 个函数,即 result[i](),结果与 fn(arr[i]) 相同
17.已知函数 fn 执行需要 3 个参数。请实现函数 partial,调用之后满足如下条件:
1、返回一个函数 result,该函数接受一个参数
2、执行 result(str3) ,返回的结果与 fn(str1, str2, str3) 一致
输入例子:
var sayIt = function(greeting, name, punctuation) { return greeting + ', ' + name + (punctuation || '!'); }; partial(sayIt, 'Hello', 'Ellie')('!!!');
输出例子:
Hello, Ellie!!!
基础写法:
function partial(fn, str1, str2) {
function result(str3){
return fn(str1,str2,str3);
}
return result;
}
call版本:
function partial(fn, str1, str2) {
function result(str3){
return fn.call(this,str1,str2,str3);
}
return result;
}
apply版本
function partial(fn, str1, str2) {
function result(str3){
return fn.apply(this,[str1,str2,str3]);
}
return result;
}
bind版本:
function partial(fn, str1, str2) {
function result(str3){
return fn.bind(this,str1,str2)(str3);
}
return result;
}
匿名函数版本
function partial(fn, str1, str2) {
return function(str3){
return fn(str1,str2,str3);
}
}