实现一下数组的filter方法
题目:实现一下数组的filter方法
这里需要直接在数组原型上绑定方法,同时需要注意filter参数支持传入的参数以及其顺序,第一个参数是当前元素,第二个参数是下标,第三个参数是当前数组
我的实现是这样的:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 Array .prototype .myFilter = function (fn ) { if (!Array .isArray (this )) { throw new Error ('Function myFilter must be called by an array!' ) } if (typeof fn !== 'function' ) { throw new TypeError (`${fn} must be a function!` ) } const res = []; const arr = this ; for (let i = 0 ; i < arr.length ; i++) { const temp = fn (arr[i], i, arr); if (temp) { res.push (arr[i]); } } return res; } const a1 = [2 , 3 , 4 , 5 , 6 , 7 , 8 ];const fn = (el, i ) => { return el > 4 ; } console .log ('数组原生filter结果:' , a1.filter (fn)); console .log ('自定义filter结果:' , a1.myFilter (fn));
大数字符串求和
题目:strA = ‘123456’, strB = ‘22345’, 实现一个方法,返回两个数的和,不使用Number方法直接转换相加,整数类型的数字,且首尾不会出现0
解决思路:首先将字符串拆成数组,并且按照个位在前,高数位数字在后的顺序保存,然后遍历两个数组,将各个数位上的数值求和,注意处理满10向下一数位进1的逻辑,最终得到一个求和之后各个数位的数组,最终使用各个数位上的数累加求出最终结果
代码实现:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 function strNumberAdd (a, b ){ let res = 0 ; function splitNum (str ){ const numArr = []; const arr = str.split ('' ); for (let i = arr.length - 1 ; i >= 0 ; i--) { numArr.push (arr[i]); } return numArr; } const aArr = splitNum (a); const bArr = splitNum (b); const aLen = aArr.length ; const bLen = bArr.length ; const len = Math .max (aLen, bLen); const sumArr = []; let temp = 0 ; for (let j = 0 ; j < len; j++) { if (j < Math .min (aLen, bLen)) { sumArr[j] = Number (aArr[j]) + Number (bArr[j]) + temp; } else { let num; if (aLen > bLen) { num = Number (aArr[j]); } else if (aLen === bLen){ num = Number (aArr[j]) + Number (bArr[j]); } else { num = Number (bArr[j]); } sumArr[j] = num + temp; } temp = 0 ; if (sumArr[j] >= 10 ) { sumArr[j] = sumArr[j] % 10 ; temp = 1 ; } } console .log ('各个数位上的数字求完和之后的数组是' , sumArr); for (let k = 0 ; k < sumArr.length ; k++) { const val = sumArr[k]; res += Number (`${val} e${k} ` ); } return res; } const a = strNumberAdd ('126435' , '2584327' );console .log ('实现的函数计算出来a的值是:' , a); console .log ('事实上a的值应该是126435 + 2584327 = ' , 126435 + 2584327 );
这样实现之后,感觉还有点问题,如果最终的和还是溢出的话,这样也不行,是不是最终的结果要转换成科学计数法表示?