JS编程修炼(一)

    xiaoxiao2022-06-29  36

    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 真是无所不能啊。

    转载请注明原文地址: https://ju.6miu.com/read-1125207.html

    最新回复(0)