大厂前端面试常问的数据处理,必会系列(二)

61 阅读1分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第19天,点击查看活动详情

  • 实现数组去重
  • 实现数组的flat方法
  • 实现数组的push方法
  • 实现数组的filter方法
  • 实现数组的map方法
  • 实现字符串的repeat方法
  • 实现字符串翻转

1. 实现数组去重

给定某无序数组,要求去除数组中的重复数字并且返回新的无重复数组。

ES6方法(使用数据结构集合):

 const array = [1, 2, 3, 5, 1, 5, 9, 1, 2, 8];
 ​
 Array.from(new Set(array)); // [1, 2, 3, 5, 9, 8]

ES5方法:使用map存储不重复的数字

 const array = [1, 2, 3, 5, 1, 5, 9, 1, 2, 8];
 ​
 uniqueArray(array); // [1, 2, 3, 5, 9, 8]
 ​
 function uniqueArray(array) {
   let map = {};
   let res = [];
   for(var i = 0; i < array.length; i++) {
     if(!map.hasOwnProperty([array[i]])) {
       map[array[i]] = 1;
       res.push(array[i]);
     }
   }
   return res;
 }

2. 实现数组的flat方法

定义:flat() 方法会按照一个可指定的深度递归遍历数组,并将所有元素与遍历到的子数组中的元素合并为一个新数组返回。

Array.prototype.flat()

例如:console.log([1 ,[2, 3]].flat()); // [1, 2, 3]

 function _flat(arr, depth) {
   if(!Array.isArray(arr) || depth <= 0) {
     return arr;
   }
   return arr.reduce((prev, cur) => {
     if (Array.isArray(cur)) {
       return prev.concat(_flat(cur, depth - 1))
     } else {
       return prev.concat(cur);
     }
   }, []);
 }

3. 实现数组的push方法

push() 向数组的末尾添加一个或更多元素,并返回新的长度

例如:var arr = [1, 2];

arr.push(3,4); //返回 arr 的新长度 4,arr = [1,2,3,4];

 let arr = [];
 Array.prototype.push = function() {
     for( let i = 0 ; i < arguments.length ; i++){
         this[this.length] = arguments[i] ;
     }
     return this.length;
 }

4. 实现数组的filter方法

定义: filter()创建一个新的数组,新数组中的元素是通过检查指定数组中符合条件的所有元素。

 Array.prototype._filter = function(fn) {
     if (typeof fn !== "function") {
         throw Error('参数必须是一个函数');
     }
     const res = [];
     for (let i = 0, len = this.length; i < len; i++) {
         fn(this[i]) && res.push(this[i]);
     }
     return res;
 }

5. 实现数组的map方法

 Array.prototype._map = function(fn) {
    if (typeof fn !== "function") {
         throw Error('参数必须是一个函数');
     }
     const res = [];
     for (let i = 0, len = this.length; i < len; i++) {
         res.push(fn(this[i]));
     }
     return res;
 }

6. 实现字符串的repeat方法

输入字符串s,以及其重复的次数,输出重复的结果,例如输入abc,2,输出abcabc。

 function repeat(s, n) {
     return (new Array(n + 1)).join(s);
 }

递归:

 function repeat(s, n) {
     return (n > 0) ? s.concat(repeat(s, --n)) : "";
 }

7. 实现字符串翻转

在字符串的原型链上添加一个方法,实现字符串翻转:

 String.prototype._reverse = function(a){
     return a.split("").reverse().join("");
 }
 var obj = new String();
 var res = obj._reverse ('hello');
 console.log(res);    // olleh

需要注意的是,必须通过实例化对象之后再去调用定义的方法,不然找不到该方法。