gpt4 book ai didi

javascript - 自定义类扩展 Array 而不使用扩展语法

转载 作者:行者123 更新时间:2023-12-01 15:39:41 24 4
gpt4 key购买 nike

几年来,我一直在构建和使用 JavaScript 中的自定义数据分析工具(repodocs)。
我最近所做的更改之一是使用 JavaScript 类来扩展原生 Array类型,因此我可以轻松地将我的自定义函数调用为类数组对象上的方法,而不是将它们作为参数传递给这些函数,而不会失去使用 [] 访问元素的能力符号。
为此,我一直在使用以下代码:

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

// ...
}
这在一段时间内运行良好,但最近我尝试加载特别大的数据集,但遇到了问题。我试图创建一个 AnalyserRows包含大约 66,000 个元素的对象,但 Chrome 会抛出此错误:

Uncaught RangeError: Maximum call stack size exceeded


在我的搜索中,我发现了这个问题的解释:
RangeError - Maximum Call Stack Size Exceeded Error Using Spread Operator in Node.js / Javascript

The spread operator (and Array.assign) loads the entire source array onto the stack, then pushes it onto the destination array. Once the source array exceeds 125,052, it causes a Stack Overflow / Range Error.


所以现在我的问题是如何调用 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];
}
}

// ...
}
但是,对于大型阵列,这可能非常慢。从您给出的报价来看,听起来任何内置快捷方式都会遇到堆栈溢出问题。

关于javascript - 自定义类扩展 Array 而不使用扩展语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63839146/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com