我是靠谱客的博主 单薄御姐,最近开发中收集的这篇文章主要介绍Array.flat的实现方式,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

Array.flat() 方法会递归到指定深度将所有子数组连接,并返回一个新数组。具体可查看Array.prototype.flat() 。

那我们先在先来模仿将数组按照 Infinity 深度进行展开,先不考虑深度问题,实现方式如下:

var flat = function(arr) {
    let res = [],
        flatMap = (arr) => {
            arr.map((element, index, array) => {
                if(Object.prototype.toString.call(element).slice(8, -1) === 'Array'){
                    flatMap(element);
                }else{
                    res.push(element);
                }
            })
        };
    flatMap(arr);
    return res;
};
console.log(flat([1,[8, 5], [6, 4, 8, [8, 3, [5, 9]]]])); // [1, 8, 5, 6, 4, 8, 8, 3, 5, 9]

这个时候我们再考虑深度问题,实现方式如下:

var flat = function(arr, depth) {
    let res = [],
        depthArg = depth || 1,
        depthNum = 0,
        flatMap = (arr) => {
            arr.map((element, index, array) => {
                if(Object.prototype.toString.call(element).slice(8, -1) === 'Array'){
                    if(depthNum < depthArg){
                        depthNum++;
                        flatMap(element);
                    }else{
                        res.push(element);
                    }
                }else{
                    res.push(element);
                    if(index === array.length -1) depthNum = 0;
                }
            });
        };
    flatMap(arr);
    return res;
};
console.log(flat([1,[8, 5], [6, 4, 8, [8, 3, [5, 9]]]], Infinity)); // [1, 8, 5, 6, 4, 8, 8, 3, 5, 9]
console.log(flat([1,[8, 5], [6, 4, 8, [8, 3, [5, 9]]]])); // [1, 8, 5, 6, 4, 8, [8, 3, [5, 9]]]
console.log(flat([1,[8, 5], [6, 4, 8, [8, 3, [5, 9]]]], 2)); // [1, 8, 5, 6, 4, 8, 8, 3, [5, 9]]
console.log(flat([1,[8, 5], [6, 4, 8, [8, 3, [5, 9]]]], 3)); // [1, 8, 5, 6, 4, 8, 8, 3, 5, 9]

这个时候我们再加一些判断,就可以封装成一个简单的 Polyfill :

if (!Array.prototype.flat) {
    Object.defineProperty(Array.prototype, 'flat', {
        value: function(depth) {
            let res = [],
                depthArg = depth || 1,
                depthNum = 0,
                flatMap = (arr) => {
                    arr.map((element, index, array) => {
                        if(Object.prototype.toString.call(element).slice(8, -1) === 'Array'){
                            if(depthNum < depthArg){
                                depthNum++;
                                flatMap(element);
                            }else{
                                res.push(element);
                            }
                        }else{
                            res.push(element);
                            if(index === array.length -1) depthNum = 0;
                        }
                    });
                };
            flatMap(this);
            return res;
        }
    });
}
console.log([1,[8, 5], [6, 4, 8, [8, 3, [5, 9]]]].flat(Infinity)); // [1, 8, 5, 6, 4, 8, 8, 3, 5, 9]
console.log([1,[8, 5], [6, 4, 8, [8, 3, [5, 9]]]].flat()); // [1, 8, 5, 6, 4, 8, [8, 3, [5, 9]]]
console.log([1,[8, 5], [6, 4, 8, [8, 3, [5, 9]]]].flat(2)); // [1, 8, 5, 6, 4, 8, 8, 3, [5, 9]]
console.log([1,[8, 5], [6, 4, 8, [8, 3, [5, 9]]]].flat(3)); // [1, 8, 5, 6, 4, 8, 8, 3, 5, 9]

更新相关信息可查看 practical-code-snippet 。

最后

以上就是单薄御姐为你收集整理的Array.flat的实现方式的全部内容,希望文章能够帮你解决Array.flat的实现方式所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(44)

评论列表共有 0 条评论

立即
投稿
返回
顶部