Q1:找出元素 item 在给定数组 arr 中的位置 ,如果数组中存在 item,则返回元素在数组中的位置,否则返回 -1.
function indexOf(arr, item) {
if(arr.__proto__.indexOf){
return arr.indexOf(item);
}
else{
for(var i=0;i<arr.length;i++){
if(arr[i] == item)
return i;
}
}
return -1;
}
注意的一点就是想要用Js的内置方法需要先检验下该方法是否存在。
Q2:计算给定数组 arr 中所有元素的总和 .
var arr = [1,2,3,4];
//常规循环
var sum1 = function(arr){
var res = 0 ;
arr.forEach(function(val,i){
res += val;
})
return res;
}
//内置方法
var sum2 = function(arr){
arr.reduce(function(prev,curr,id,arr){
return prev+curr;
})
}
var sum3 = function(arr){
return eval(arr.join('+'));
}
这道在于你能找出几种方法去解决,eval()函数用于计算参数的js代码
Q3:移除数组 arr 中的所有值与 item 相等的元素。不要直接修改数组 arr,结果返回新的数组
var arr = [1,2,3,4,2];
// splice
var remove = function(arr,item){
var res = arr.slice(0);
for(var i = 0;i<res.length;i++){
if(res[i] === item){
res.splice(i,1);
--i;
}
}
return res;
}
// push
var remove1 = function(arr,item){
var res = [];
arr.forEach(function(val,i){
if(val !== item){
res.push(val);
}
})
return res;
}
//filter
var remove2 = function(arr,item){
if(Array.prototype.filter){
return arr.filter(function(val){
return val !== item;
})
}
}
splice()会改变原数组,返回截取的元素数组。slice()不会改变原数组,返回想要获取的元素,slice(start,end),参数为获取区间,end不写表示获取到结束位置。
Q4:在数组 arr 末尾添加元素 item。不要直接修改数组 arr,结果返回新的数组
var arr = [1,2,3,4,2];
// slice
var append = function(arr,item){
var res = arr.slice(0); // 拷贝数组
res.push(item);
return res;
}
// for
var append1 = function(arr,item){
var res = [];
arr.forEach(function(val,i,arr){
res.push(val);
})
res.push(item);
return res;
}
//concat
var append2 = function(arr,item){
if(Array.prototype.concat){
return arr.concat(item); //返回新数组
}
}
利用concat在末尾添加元素,可以添加单个元素或者是整个数组,返回新数组,不修改原数组。
Q5:删除数组 arr 第一个元素。不要直接修改数组 arr,结果返回新的数组 .
// shift
var curtail = function(arr){
var res = arr.slice(0);
res.shift();
return res;
}
// slice
var curtail1 = function(arr){
return arr.slice(1);
}
// filter
var curtail2 = function(arr){
return arr.filter(function(val,i){
if(i!=0)
return val;
})
}
Q6:统计数组 arr 中值等于 item 的元素出现的次数
var arr = [1,2,3,4,2];
// 直接计数
var count = function(arr,item){
var cnt = 0;
arr.forEach(function(val,i){
val === item?cnt++:0;
})
return cnt;
}
//filter
var count1 = function(arr,item){
return arr.filter(function(val){
return val === item;
}).length;
}
// reduce
var count2 = function(arr,item){
var cnt;
cnt = arr.reduce(function(prev,curr){
return curr === item? ++prev : prev;
},0);
return cnt;
}
Q7:找出数组 arr 中重复出现过的元素
var arr = [1,2,3,4,2,3]; // =>[2,3]
// 利用中间对象
var duplicates = function(arr){
var res = [];
var obj = {};
arr.forEach(function(val,i){
if(obj[val]==1){
res.push(val);
obj[val]++;
}
else if(obj[val]>1){
obj[val]++;
}
else{
obj[val]=1;
}
})
return res;
}
// indexOf
var duplicates1 = function (arr){
var res = [];
arr.forEach(function(val){
if(arr.indexOf(val) !== arr.lastIndexOf(val) && res.indexOf(val) === -1){
res.push(val);
}
})
return res;
}
// filter
var duplicates2 = function(arr){
return arr.sort().filter(function(val,i){
return arr[i]===arr[i+1] && arr[i]!==arr[i-1];
})
}
其实也可以开多一个数组进行下标计数,但是考虑到可能要开很大的数,所以就没用这种方法。
Q8:为数组 arr 中的每个元素求二次方。不要直接修改数组 arr,结果返回新的数组
var arr = [1,2,3]; // => [1,4,9]
var square = function(arr){
var res = [];
arr.forEach(function(x){
res.push(x*x);
})
return res;
}
// map
var square1 = function(arr){
return arr.map(function(x){
return x*x;
})
}
Q9:在数组 arr 中,查找值与 item 相等的元素出现的所有位置
var arr = [1,2,3,2,4]; // => [1,3]
// indexOf
var find = function(arr,item){
var pos = 0;
var res = [];
while(pos !== -1){
pos = arr.indexOf(item,pos);
if(pos === -1){
break;
}
else{
res.push(pos);
pos++;
}
}
return res;
}
// filter
var find1 = function(arr,item){
var res = [];
arr.filter(function(val,i){
return val===item&&res.push(i);
})
return res;
}
// for
var find2 = function(arr,item){
var res = [];
arr.forEach(function(val,i){
if(val === item){
res.push(i);
}
})
return res;
}
fitlter 真是无所不能啊。