数组 深浅拷贝 扁平化 前端算法

目录

数组去重

深浅拷贝

浅拷贝的实现

深拷贝的实现

数组最大值和最小值 

最大值

最小值 

reduce

underscore在数组中查找指定元素

 前端算法地位


 

数组去重

var array = [1, 1, '1', '1', null, null, undefined, undefined, new String('1'), new String('1'), /a/, /a/, NaN, NaN];
let newArr = [...new Set(array)]
console.log(newArr)

深浅拷贝

浅拷贝:将原对象或原数组的引用直接赋给新对象,新数组,新对象/数组只是原对象的一个引用(拷贝后的引用都是指向同一个对象的实例,彼此之间的操作会互相影响)

浅拷贝的实现

var shallowCopy = function(obj) {
    // 只拷贝对象
    if (typeof obj !== 'object') return;
    // 根据obj的类型判断是新建一个数组还是对象
    var newObj = obj instanceof Array ? [] : {};
    // 遍历obj,并且判断是obj的属性才拷贝
    for (var key in obj) {
        if (obj.hasOwnProperty(key)) {
            newObj[key] = obj[key];
        }
    }
    return newObj;
}

深拷贝:将原对象的各个属性的“值”逐个复制出去,而且将原对象各个属性所包含的对象也依次采用深拷贝的方法递归复制到新对象上(注意拷贝的“值”,而不是“引用”) 

深拷贝的实现

var deepCopy = function(obj) {
    if (typeof obj !== 'object') return;
    var newObj = obj instanceof Array ? [] : {};
    for (var key in obj) {
        if (obj.hasOwnProperty(key)) {
            newObj[key] = typeof obj[key] === 'object' ? deepCopy(obj[key]) : obj[key];
        }
    }
    return newObj;
}

数组最大值和最小值 

最大值

var arr = [6, 4, 1, 8, 2, 11, 23];
let maxArr = Math.max(...arr)
console.log(maxArr)

最小值 

var arr = [6, 4, 1, 8, 2, 11, 23];
let minArr = Math.min(...arr)
console.log(minArr)

reduce

方案一:
var arr = [6, 4, 1, 8, 2, 11, 23];

function max(prev, next) {
    return Math.max(prev, next);
}
方案二:
var arr = [6, 4, 1, 8, 2, 11, 23];
function max(array) {
    return arr.reduce((a,b)=>a > b ? a : b)
}
方案三:
//{}或者undefined
function sortArr(arr) {
    var max = min = arr[0];
    for (var i = 0; i < arr.length; i++) {
    arr[i] > max ? max = arr[i] : '';
    arr[i] < min ? min = arr[i] : '';
    }
return [max, min]
}
console.log(sortArr([11, 3, 5, 3, 66, 22, 66, 33, 565, 2222, 4, 3,{},]))

console.log(arr.reduce(max));

数组的扁平化,就是将一个嵌套多层的数组array(嵌套可以是任何层数)转换为只有一层的数组。

underscore在数组中查找指定元素

  1. ES6对数组新增的findIndex()方法,它会返回数组中满足提供的函数的第一个元素的索引,否则返回-1;
  2. findIndex()与find()的使用方法相同,只是当条件为true时,findIndex()返回的是索引值,而find()返回的是元素。如果没有符合条件元素时findIndex()返回的是-1,而find()返回的是undefined。findIndex()当中的回调函数也是接收三个参数,与find()相同;
  3. sortedIndex(array,value)用于二分查找来查到一个值应该在哪个索引插入数组后还能保持数组的排序;
  4. 在一个排好序的数组中找到value对应的位置,保证插入数组后,依然保持有序的状态。

 

function Greet() {
  this.prefix = 'Hello'
  this.friends = ['dowinweb', 'kevin']
}

Greet.prototype.sayHello = function(){
  var res = this.friends.map(function(item){
        return this.prefix + ' ' +  item
  }, this)
  return res
}

var greet = new Greet();
console.log(greet.sayHello())  //  // [ "Hello dowinweb", "Hello kevin" ]

 前端算法地位

  1. 安全。web安全在前端已经占有一定比重,尤其是支付领域等,最常见的就是登陆验证码;
  2. 用户体验。面向用户的东西必须用户体验优先,算法和用户体验也有关联,但通过算法在前端大幅度提高性能导致提高用户体验,是非常少的;
  3. 模块化和可扩展性。前端需要改代码的情况往往是比较多的,谁都不希望我要修改代码添加代码的时候会产生连锁反应,我明明要改的只是一个功能一个函数,却不得不因此改十几个函数,这多悲催;
  4. 语义化和可维护性。代码的可读性也非常重要,程序员大部分的时间都是在查修bug,要是随手写一坨自己回过头都看不懂代码,那多尴尬。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值