微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

自定义类扩展数组而不使用扩展语法

如何解决自定义类扩展数组而不使用扩展语法

几年来,我一直在构建和使用JavaScript(repodocs)中的自定义数据分析工具。

我最近所做的更改之一是使用JavaScript类扩展了本机Array类型,因此我可以轻松地将自定义函数作为类数组对象上的方法调用,而不用传递它们这些参数作为参数使用,而不会失去使用[]表示法访问元素的能力。

为此,我一直在使用以下代码

class AnalyserRows extends Array {
    constructor(sourceArray) {
        super(...sourceArray);
    }

    // ...
}

这已经工作了一段时间了,但是最近我尝试加载一组特别大的数据,但遇到了问题。我试图创建一个包含约66,000个元素的AnalyserRows对象,但是Chrome抛出此错误

未捕获的RangeError:超出了最大调用堆栈大小

搜索中,我找到了此问题的解释: RangeError - Maximum Call Stack Size Exceeded Error Using Spread Operator in Node.js / Javascript

spread运算符(和Array.assign)将整个源数组加载到堆栈上,然后将其推到目标数组上。源数组超过125,052后,将导致堆栈溢出/范围错误

所以现在我的问题是,如何在自定义类的super调用constructor并通过源数组的每个元素而不使用散布运算符?

可以创建具有这么多元素的Array而没有任何实际问题,所以我认为应该可以对扩展Array的类进行相同的操作像这样。但是,如果不使用传播运算符或进行其他更改使我无法使用自己一直在使用的某些语法,那么我将看不到该怎么做。

解决方法

Array构造函数有两种形式:可以将所有数组元素都传递给它,或者可以将数组的大小传递给它。您可以尝试使用第二种形式,然后在构造函数中复制数组元素。

class AnalyserRows extends Array {
    constructor(sourceArray) {
        super(sourceArray.length);
        for (let i = 0; i < sourceArray.length; i++) {
            this[i] = sourceArray[i];
        }
    }

    // ...
}

但是,这对于大型数组可能非常慢。从您提供的报价来看,似乎任何内置的快捷方式都会遇到堆栈溢出问题。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?