Array方法及其实现

2019年都快过完了,你还在用老掉渣的for循环和forEach么?

教你几招,让你秒变代码最清爽的仔!!!

基础篇

数组方法mapfiltersomereduceforEach的pk

Round 1: map vs forEach

// double number 
const number = [1,2,3,4,5];

// forEach Version
const doubleNumber = [];
number.forEach(item => doubleNumber.push(item * 2))

// map Version
const douberNumber = number.map(item => item * 2);
复制代码

map函数一行搞定,简直完胜;

Round2: filter vs forEach

// filter number that less than 10
const number = [1,12,3,24,5];

// forEach Version
const filterNumber = [];
number.forEach(item => {
    if (item < 10) {
        filterNumber.push(item);   
    }
})

// filter Version
const filterNumber = number.filter(item => item < 10);
复制代码

filter函数一行搞定,forEach要6行。 filter简直是减轻工作量利器!

Round3: some vs forEach 类似的还有every方法

// is there anyone element greater than 10
const number = [1,12,3,24,5];

// forEach Version
const flag = false;
number.forEach(item => {
    if (flag > 10) {
        flag = true;
    }
})

// some Version
const flag = number.some(item => item > 10)
复制代码

some同样一行搞定

Round4: reduce vs forEach

const number = [1,2,3,4,5];

//  forEach Version
const total = 0;
number.forEach(item => total += item)

// reduce Version
const total = number.reduce((total, value) => total + value)
复制代码

reduce同样简洁明了

优势(使用map、filter、reduce、every、some等函数优势)

  • 减少代码量
  • 语义化表达其他人很容易明白代码用意
  • 函数化编程,少引入额外的作用
  • 易于维护、测试和扩展

劣势

相比于for循环,map这些方法可能在极其严苛的情况下会相对来说慢点。
但是和forEach相比性能是一样的。

提高篇

详细介绍具体数组方法及其实现

map介绍

map方法: 接收两个参数,一个是函数,另一个是函数的this值。 arr.map(callback(currentValue[[, index[, array]]), [,thisArg])

[]中内容代表可选参数 下同

map用法

const number = [0.1, 1.5, 2.9];
const ceil = number.map(item => Math.ceil(item));
// number值不会改变, ceil值是[0,1,2]

const number = [{a: 1}, {a: 2}, {a: 3}];
const sumNumber = number.map(function(item) {
    return item.a + this;
}, 100)
// number值不会改变, sumNumber值为[101, 102, 103]
// notice: 当map有第二个参数时,第一个参数callback就不能写成箭头函数的形式了。是由于箭头函数的this是在定义的时候已经确定,而不是调用的时候确定。

'paprika is a good gril'.split('').map(item => item.charCodeAt(0));
Array.prototype.map.call('paprika is a good gril', item => item.charCodeAt(0))
// 两种方式给字符串应用map方法

['1', '2', '3'].map(parseInt) // [1, NaN, NaN]
['1', '2', '3'].map(item => parseInt(item)) // [1, 2, 3]
复制代码

map实现

if (!Array.prototype.map) {
    Array.prototype.map = function(callback, thisArg) {
        var T, A, k;
        if (this == null) {
            throw new TypeError('this is null not defined');
        }
        // 让this一定会有length方法;
        // 如果通过Array.prototype.map.call(111),这个时候this是Number类型111,没有length方法。主要是处理这种类似的特殊情况。
        var O = Object(this);
        
        // >>> 0 的作用是让len的值始终为正整数
        var len = O.length >>> 0;
        
        if (typeof callback !== 'function') {
            throw new TypeError(callback + 'is not a functon');
        }
        
        if (arguments.length > 1) {
            T = arguments[1];
        }
        
        A = new Array(len);
        
        k = 0;
        
        while (k < len) {
            var kValue, mappedValue;
            
            if (k in O) {
                kValue = 0;
                
                mappedValue = callback.call(T, kValue, k, 0);
                A[k] = mappedValue;
            }
            
            k++;
        }
        
        return A;
    }
}
复制代码

filter介绍

arr.filter((callback[[, index], array])[, thisArg]) filter参数格式和map一致,一个函数,一个可选的this参数

filter用法


复制代码

剩下内容,我们后续见(#^.^#)

引用:
developer.mozilla.org/en-US/docs/…

有问题的话,请多多交流ღ( ´・ᴗ・` )。


作者:forgetandforward
链接:https://juejin.im/post/5d79af9ef265da03f233fa04
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值