我还在学JS。在其他语言中,您可以通过them传递变量,然后在代码的其他地方修改它们。
为了避免出现大量重复代码,我构造了一系列回调和解析,如下所示:
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通过了not,我无法达到预期的效果(例如,this.OneMinuteData数组没有被修改)。
正因为如此,我目前知道如何解决这个问题的唯一方法就是对每个单独的数组进行相同的函数复制-粘贴,我发现这是非常草率的。有更好的方法吗?
发布于 2017-11-26 20:25:02
但是,由于JS是由not传递的,所以我无法达到预期的效果(例如,this.OneMinuteData数组没有被修改)。
虽然JavaScript确实按值传递,但在处理对象(包括任何数组)时,该值是引用。
请参阅concat文件
concat()方法用于合并两个或多个数组。此方法不更改现有数组,而是返回一个新数组。
因此,当您说dataStore = dataStore.concat(items);时,您将一个新数组分配给本地dataStore变量,并丢弃旧的数组。
在函数之外,原始数组不变。
分配给OneMinuteData的数组未被修改的原因是您从未修改过任何数组。
将items的值推入dataStore中。
dataStore.push.apply(dataStore, items);注意:GetRates有异步函数的签名,所以请确保在修改OneMinuteData之前不要尝试检查它们。
https://stackoverflow.com/questions/47500613
复制相似问题