我还在学习JS。在其他一些语言中,您可以通过参数传递变量,然后在代码中的其他位置修改它们。
为了避免出现大量重复代码,我构建了一系列回调和解析,如下所示:
class MarketData {
constructor() {
//Arrays
this.OneMinuteData = [];
this.ThreeMinuteData = [];
this.initializeCandleData();
}
initializeData() {
var client = new Client();
this._initializeData(60, client, this.OneMinuteData);
this._initializeData(180, client, this.ThreeMinuteData);
}
_initializeData(granularity, client, dataStore) {
client.GetRates({ granularity: granularity }, function(err, msg, data) {
var items = data.map(item => ({
///data mapped here
}));
dataStore = dataStore.concat(items);
}
}
所以基本上我有这个'私有'_initializeData
函数,希望传入一个数组并将它添加到数组中,但是由于JS传递了byval,我无法达到预期的效果(例如this.OneMinuteData数组未被修改。)
正因为如此,我目前知道如何解决这个问题的唯一方法是基本上为每个单独的数组复制粘贴相同的功能,我觉得非常草率。有没有更好的方法呢?
答案 0 :(得分:3)
但是由于JS通过byval,我无法达到预期的效果(例如,此.OneMinuteData数组未被修改)。
当JavaScript传递值时,处理对象(包括任何数组)时的值是一个引用。
请参阅the documentation for concat:
concat()方法用于合并两个或多个数组。此方法不会更改现有数组,而是返回一个新数组。
因此,当您说dataStore = dataStore.concat(items);
时,您会为本地dataStore
变量分配一个新数组并丢弃旧数组。
在函数外部,原始数组不变。
分配给OneMinuteData
的数组未被修改的原因是因为您从不修改任何数组。
将items
的值改为dataStore
。
dataStore.push.apply(dataStore, items);
注意:GetRates
具有异步功能的签名,因此请确保在制作之前不要检查OneMinuteData
的修改。