前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >js 为Array实现一个Reader,通过接口getReader获取,Reader 有一个接口 read(n)

js 为Array实现一个Reader,通过接口getReader获取,Reader 有一个接口 read(n)

作者头像
蓓蕾心晴
发布2022-11-29 21:43:50
5050
发布2022-11-29 21:43:50
举报
文章被收录于专栏:前端小叙前端小叙

为Array实现一个Reader,通过接口getReader获取,Reader 有一个接口 read(n) 每次调用会按顺序读区数组的n(默认为1)个元素,调用不会改变数组本身的值,若数组已全部读取完则返回空数组,若传入的参数不为正整数则抛出异常 例:

代码语言:javascript
复制
const arr = [1, 2, 3, 4, 5, 6]
const reader = arr.getReader()
console.log(reader.read(‘1’)) // Error
console.log(reader.read(-1)) // Error
console.log(reader.read(1.5)) // Error
console.log(reader.read()) // [1]
console.log(reader.read(1)) // [2]
console.log(reader.read(2)) // [3,4]
console.log(reader.read(3)) // [5,6]
console.log(reader.read()) // []

方案一,splice

代码语言:javascript
复制
Array.prototype.getReader = function () {
    //复制原数组
    let readArr = [...this];
    return {
        read(num) {
            //如果有参数,判断参数
            if (num) {
                try {
                    if (typeof num == "string") {
                        throw Error();
                    } else if (!/(^[1-9]\d*$)/.test(num)) {
                        //正则判断正整数 /^[1-9]\d*$/
                        throw Error();
                    } else {
                        return readArr.splice(0, num);
                    }
                } catch (e) {
                    return "Error";
                }
            } else {
                return readArr.splice(0, 1);
            }
        },
    };
};

方案二,slice

代码语言:javascript
复制
Array.prototype.getReader = function () {
    //拿到原数组
    let that = this;
    let count = 0;
    return {
        read(num) {
            //如果有参数,判断参数
            if (num) {
                try {
                    if (typeof num == "string") {
                        throw Error();
                    } else if (!/(^[1-9]\d*$)/.test(num)) {
                        //正则判断正整数 /^[1-9]\d*$/
                        throw Error();
                    } else {
                        let res = that.slice(count, count + num);
                        count = count + num;
                        return res;
                    }
                } catch (e) {
                    return "Error";
                }
            } else {
                //如果没有参数,默认为1
                if (that.length) {
                    let res = that.slice(count, count + 1);
                    count = count + 1;
                    return res;
                } else {
                    return [];
                }
            }
        },
    };
};
代码语言:javascript
复制
//实例
const arr = [1, 2, 3, 4, 5, 6];
const reader = arr.getReader();
console.log(reader.read("1")); // Error
console.log(reader.read(-1)); // Error
console.log(reader.read(1.5)); // Error
console.log(reader.read()); // [1]
console.log(reader.read(1)); // [2]
console.log(reader.read(2)); // [3,4]
console.log(reader.read(3)); // [5,6]
console.log(reader.read()); // []
本文参与?腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022-11-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客?前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与?腾讯云自媒体分享计划? ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
http://www.vxiaotou.com