Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/414.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在JS for if循环中动态选择预定义变量?_Javascript - Fatal编程技术网

Javascript 如何在JS for if循环中动态选择预定义变量?

Javascript 如何在JS for if循环中动态选择预定义变量?,javascript,Javascript,我有一个JSON对象,其中包含外汇交易,每个交易都有以下键:value 现在我想定义一个循环,循环遍历每个对象并返回主要货币欧元、英镑、澳元、瑞士法郎、日元、美元和加元的交易量。 在给出的示例中,每笔交易由一种基础货币组成:澳元,在给出的示例中由一种对应货币组成:CAD 每笔交易要么是长订单类型0、2、4,要么是短订单类型1、3、5 每笔交易都有一个以订单量表示的交易量,其中1.00等于100.000个交易单位 现在,循环的想法如下: 检查是否是包含两种主要货币的货币对,例如欧元兑美元、澳元兑

我有一个JSON对象,其中包含外汇交易,每个交易都有以下键:value

现在我想定义一个循环,循环遍历每个对象并返回主要货币欧元、英镑、澳元、瑞士法郎、日元、美元和加元的交易量。

在给出的示例中,每笔交易由一种基础货币组成:澳元,在给出的示例中由一种对应货币组成:CAD

每笔交易要么是长订单类型0、2、4,要么是短订单类型1、3、5

每笔交易都有一个以订单量表示的交易量,其中1.00等于100.000个交易单位

现在,循环的想法如下:

检查是否是包含两种主要货币的货币对,例如欧元兑美元、澳元兑加元等。 如果是,则计算基础货币和交易货币的交易量 如果不是,则根据哪种货币是主要货币,计算基础货币或对应货币的交易量 我在代码片段底部看到的问题是,我不知道如何根据需要动态选择预定义变量。否则,我将不得不设置几十个其他if语句

// define variables
var eurVolumeBought = 0
var eurVolumeSold = 0
var usdVolumeBought = 0
var usdVolumeSold = 0
[...]
var chfVolumeBought = 0
var chfVolumeSold = 0

// iterate each trade in returned JSON object 
for (var i = 0; i < tradesTotal; i++) {

    symbol = trades[i].fields.orderSymbol
    // returns e.g. AUD/CAD

    symbolBase = symbol.slice(0, 3)
    // returns e.g. AUD

    symbolCounter = symbol.slice(3, 6)
    // returns e.g. CAD

    lots = trades[i].fields.orderLots
    // returns e.g. 1.00

    orderType = trades[i].fields.orderType
    // orderTypes 0, 2, 4 are long trades and 1, 3, 5 are short trades accordingly

    // check for main pairs where that contain two major currencies
    if (symbolBase.match(/^(EUR|GBP|AUD|CHF|JPY|USD|CAD)$/) && symbolCounter.match(/^(EUR|GBP|AUD|CHF|JPY|USD|CAD)$/){

        // Create logic for long trades
        if (orderType == '0' || orderType == '2' || orderType == '4') {


        // >>>> here i run into issues <<<<
        // In the example given, we have a AUDCAD long trade of 100.000 units.
        // Thus, I want to dynamically pick the audVolumeBought and cadVolumeSold variables 
        // to increase them accordingly. My foolish approach right now is as follows:

        symbolBase = symbolBase.toLowerCase()
        (symbolBase + 'volumeBought') = lots * 100.000 // I try to grab audVolumeBought variable here
        }

}

返回NaN

作为第一步,您可以收集对象中每种货币的所有交易:

let result = {}; // Each key in this object will correspond to a currency

for (var i = 0; i < tradesTotal; i++) {

    symbol = trades[i].fields.orderSymbol
    symbolBase = symbol.slice(0, 3)
    symbolCounter = symbol.slice(3, 6)
    lots = trades[i].fields.orderLots

    orderType = trades[i].fields.orderType

    if (symbolBase.match(/^(EUR|GBP|AUD|CHF|JPY|USD|CAD)$/) && symbolCounter.match(/^(EUR|GBP|AUD|CHF|JPY|USD|CAD)$/){

        if (orderType == '0' || orderType == '2' || orderType == '4') {

            symbolBase = symbolBase.toLowerCase()

            if(result.hasOwnProperty(symbolBase + 'volumeBought')) {
                result[symbolBase + 'volumeBought'] += lots * 100.000
            }
            else {
                result[symbolBase + 'volumeBought'] = lots * 100.000
            }

        }
    // ... handle short case 

}

注意:我不确定这是否完全符合您所要求的逻辑。但这可能是一个很好的起点。

作为第一步,您可以收集对象中每种货币的所有交易:

let result = {}; // Each key in this object will correspond to a currency

for (var i = 0; i < tradesTotal; i++) {

    symbol = trades[i].fields.orderSymbol
    symbolBase = symbol.slice(0, 3)
    symbolCounter = symbol.slice(3, 6)
    lots = trades[i].fields.orderLots

    orderType = trades[i].fields.orderType

    if (symbolBase.match(/^(EUR|GBP|AUD|CHF|JPY|USD|CAD)$/) && symbolCounter.match(/^(EUR|GBP|AUD|CHF|JPY|USD|CAD)$/){

        if (orderType == '0' || orderType == '2' || orderType == '4') {

            symbolBase = symbolBase.toLowerCase()

            if(result.hasOwnProperty(symbolBase + 'volumeBought')) {
                result[symbolBase + 'volumeBought'] += lots * 100.000
            }
            else {
                result[symbolBase + 'volumeBought'] = lots * 100.000
            }

        }
    // ... handle short case 

}

注意:我不确定这是否完全符合您所要求的逻辑。但这可能是一个很好的起点。

这里有一个仅包含三个if表达式的解决方案:

风险值ma=[‘欧元’、‘英镑’、‘澳元’、‘瑞士法郎’、‘日元’、‘美元’、‘加拿大元’]; var volumeBought={},volumeSold={}; 瓦尔乔=[ {字段:{orderType:0,orderLots:1.00,orderSymbol:AUDCAD}, {字段:{订单类型:1,订单批次:0.80,订单符号:USDEUR}, {字段:{orderType:2,orderLots:1.40,orderSymbol:EURAUD}}, {字段:{orderType:3,orderLots:2.20,orderSymbol:AUDCAD}, {字段:{orderType:4,orderLots:1.10,orderSymbol:CADDKK}, {字段:{orderType:5,orderLots:1.30,orderSymbol:GBPUSD}, {字段:{orderType:0,orderLots:3.04,orderSymbol:DKKCAD}, {字段:{orderType:1,orderLots:1.10,orderSymbol:USDCHF}, {字段:{orderType:2,orderLots:0.90,orderSymbol:JPYEUR}, {字段:{orderType:3,orderLots:0.40,orderSymbol:AUDJPY}, {字段:{orderType:4,orderLots:2.30,orderSymbol:CHFGBP}, {字段:{订单类型:5,订单批次:3.10,订单符号:EURUSD}, {字段:{orderType:0,orderLots:4.25,orderSymbol:AUDNGN}, {字段:{订单类型:1,订单批次:0.60,订单符号:USDGBP}, {字段:{orderType:2,orderLots:1.70,orderSymbol:GBPUR}} ]; jo.forEach{fields}=>{ 如果!字段。订单类型%2{ var sld=字段.orderSymbol.substr0,3, bgt=字段.orderSymbol.substr3,6, 批次=字段。订单批次*100000; 如果ma.indexOfsld>-1volumeSold[sld]=volumeSold[sld]| | 0+批次 如果ma.indexOfbgt>-1volumeBought[bgt]=volumeBought[bgt]| | 0+批次 } }; console.log'sell:',JSON.stringifyvolumeSold
console.log'bunded:',JSON.stringifyvolumeBought这里是一个只包含三个if表达式的解决方案:

风险值ma=[‘欧元’、‘英镑’、‘澳元’、‘瑞士法郎’、‘日元’、‘美元’、‘加拿大元’]; var volumeBought={},volumeSold={}; 瓦尔乔=[ {字段:{orderType:0,orderLots:1.00,orderSymbol:AUDCAD}, {字段:{订单类型:1,订单批次:0.80,订单符号:USDEUR}, {字段:{orderType:2,orderLots:1.40,orderSymbol:EURAUD}}, {字段:{orderType:3,orderLots:2.20,orderSymbol:AUDCAD}, {字段:{orderType:4,orderLots:1.10,orderSymbol:CADDKK}, {字段:{orderType:5,orderLots:1.30,orderSymbol:GBPUSD}, {字段:{orderType:0,orderLots:3.04,orderSymbol:DKKCAD}, {字段:{orderType:1,orderLots:1.10,orderSymbol:USDCHF}, {字段:{orderType:2,orderLots:0.90,orderSymbol:JPYEUR}, {字段:{orderType:3,orderLots:0.40,orderSymbol:AUDJPY}, {字段:{orderType:4,orderLots:2.30,orderSymbol:CHFGBP}, {字段:{订单类型:5,订单批次:3.10,订单符号:EURUSD}, {字段:{orderType:0,orderLots:4.25,orderSymbol:AUDNGN}, {字段:{订单类型:1,订单批次:0.60,订单符号:USDGBP}, {字段:{orderType:2,orderLots:1.70,orderSymbol:GBPUR}} ]; jo.forEach{fields}=>{ 如果!字段。订单类型%2{ var sld=字段.orderSymbol.substr0,3, bgt=字段.orderSymbol.substr3,6, 批次=字段。订单批次*100000; 如果ma.indexOfsld>-1volumeSold[sld]=volumeSold[sld]| | 0+批次 如果ma.indexOfbgt>-1volumeBought[bgt]=volumeBought[bgt]| | 0+批次 } }; console.log'sell:',JSON.stringifyvolumeSold
console.log'bunded:',JSON.stringifyvolumeBought我终于找到了一个有效的解决方案。为了完整起见,请参见以下内容:

let resultBought = {}
let resultSold = {}

for (var i = 0; i < tradesTotal; i++) {

symbol = trades[i].fields.orderSymbol
// returns e.g. EUR/USD

symbolBase = symbol.slice(0, 3)
// returns e.g. EUR

symbolCounter = symbol.slice(3, 6)
// returns e.g. USD

lots = trades[i].fields.orderLots
// returns e.g. 1.00

orderType = trades[i].fields.orderType
// orderTypes 0, 2, 4 are long trades, 1, 3, 5 shorts accordingly

// check for major pairs where XXX/YYY = defined currencies
if (symbolBase.match(/^(EUR|GBP|AUD|CHF|JPY|USD|CAD)$/) && symbolCounter.match(/^(EUR|GBP|AUD|CHF|JPY|USD|CAD)$/)) {
    // Long Trades Major Pairs
    if (orderType == '0' || orderType == '2' || orderType == '4') {

        // Base currency
        if(resultBought.hasOwnProperty(symbolBase + 'VolumeBought')) {
            resultBought[symbolBase + 'VolumeBought'] += lots * 100.000
        }
        else {
            resultBought[symbolBase + 'VolumeBought'] = lots * 100.000
        }
        // Counter currency
        if(resultSold.hasOwnProperty(symbolCounter + 'VolumeSold')) {
            resultSold[symbolCounter + 'VolumeSold'] += lots * 100.000
        }
        else {
            resultSold[symbolCounter + 'VolumeSold'] = lots * 100.000
        }

    // Short Trades Major Pairs
    } else if (orderType == '1' || orderType == '3' || orderType == '5') {

        // Base currency
        if(resultSold.hasOwnProperty(symbolBase + 'VolumeSold')) {
            resultSold[symbolBase + 'VolumeSold'] += lots * 100.000
        }
        else {
            resultSold[symbolBase + 'VolumeSold'] = lots * 100.000
        }

        // Counter currency
        if(resultBought.hasOwnProperty(symbolCounter + 'VolumeBought')) {
            resultBought[symbolCounter + 'VolumeBought'] += lots * 100.000
        }
        else {
            resultBought[symbolCounter + 'VolumeBought'] = lots * 100.000
        }
      }
// consider the non major pairs
} else if (symbolBase.match(/^(EUR|GBP|AUD|CHF|JPY|USD|CAD)$/) || symbolCounter.match(/^(EUR|GBP|AUD|CHF|JPY|USD|CAD)$/)) {
    if (orderType == '0' || orderType == '2' || orderType == '4') {

        if(resultBought.hasOwnProperty(symbolBase + 'VolumeBought')) {
            resultBought[symbolBase + 'VolumeBought'] += lots * 100.000
        }
        else {
            resultBought[symbolBase + 'VolumeBought'] = lots * 100.000
        }

    } else if (orderType == '1' || orderType == '3' || orderType == '5') {

        if(resultSold.hasOwnProperty(symbolBase + 'VolumeSold')) {
            resultSold[symbolBase + 'VolumeSold'] += lots * 100.000
        }
        else {
            resultSold[symbolBase + 'VolumeSold'] = lots * 100.000
        }
      }
  }
}

我终于找到了一个有效的解决办法。为了完整起见,请参见以下内容:

let resultBought = {}
let resultSold = {}

for (var i = 0; i < tradesTotal; i++) {

symbol = trades[i].fields.orderSymbol
// returns e.g. EUR/USD

symbolBase = symbol.slice(0, 3)
// returns e.g. EUR

symbolCounter = symbol.slice(3, 6)
// returns e.g. USD

lots = trades[i].fields.orderLots
// returns e.g. 1.00

orderType = trades[i].fields.orderType
// orderTypes 0, 2, 4 are long trades, 1, 3, 5 shorts accordingly

// check for major pairs where XXX/YYY = defined currencies
if (symbolBase.match(/^(EUR|GBP|AUD|CHF|JPY|USD|CAD)$/) && symbolCounter.match(/^(EUR|GBP|AUD|CHF|JPY|USD|CAD)$/)) {
    // Long Trades Major Pairs
    if (orderType == '0' || orderType == '2' || orderType == '4') {

        // Base currency
        if(resultBought.hasOwnProperty(symbolBase + 'VolumeBought')) {
            resultBought[symbolBase + 'VolumeBought'] += lots * 100.000
        }
        else {
            resultBought[symbolBase + 'VolumeBought'] = lots * 100.000
        }
        // Counter currency
        if(resultSold.hasOwnProperty(symbolCounter + 'VolumeSold')) {
            resultSold[symbolCounter + 'VolumeSold'] += lots * 100.000
        }
        else {
            resultSold[symbolCounter + 'VolumeSold'] = lots * 100.000
        }

    // Short Trades Major Pairs
    } else if (orderType == '1' || orderType == '3' || orderType == '5') {

        // Base currency
        if(resultSold.hasOwnProperty(symbolBase + 'VolumeSold')) {
            resultSold[symbolBase + 'VolumeSold'] += lots * 100.000
        }
        else {
            resultSold[symbolBase + 'VolumeSold'] = lots * 100.000
        }

        // Counter currency
        if(resultBought.hasOwnProperty(symbolCounter + 'VolumeBought')) {
            resultBought[symbolCounter + 'VolumeBought'] += lots * 100.000
        }
        else {
            resultBought[symbolCounter + 'VolumeBought'] = lots * 100.000
        }
      }
// consider the non major pairs
} else if (symbolBase.match(/^(EUR|GBP|AUD|CHF|JPY|USD|CAD)$/) || symbolCounter.match(/^(EUR|GBP|AUD|CHF|JPY|USD|CAD)$/)) {
    if (orderType == '0' || orderType == '2' || orderType == '4') {

        if(resultBought.hasOwnProperty(symbolBase + 'VolumeBought')) {
            resultBought[symbolBase + 'VolumeBought'] += lots * 100.000
        }
        else {
            resultBought[symbolBase + 'VolumeBought'] = lots * 100.000
        }

    } else if (orderType == '1' || orderType == '3' || orderType == '5') {

        if(resultSold.hasOwnProperty(symbolBase + 'VolumeSold')) {
            resultSold[symbolBase + 'VolumeSold'] += lots * 100.000
        }
        else {
            resultSold[symbolBase + 'VolumeSold'] = lots * 100.000
        }
      }
  }
}

解决方案取决于您需要如何为循环之后的步骤构造数据。例如,您可以拥有一个结果对象,其中每个键对应一种货币。然后你可以说:result[symbolBase+'volumeBought']
=lots*100.000我知道这可能很迂腐,但orderType:0不是有效的JSON。你是说JS对象吗?@Phanti你正在序列化对象,所以我的评论无关紧要。很公平。关于你对kastenbutts的编辑,你做错了。如果你看他的代码,他第一次将变量初始化为一个数字。在你的情况下,你不是你基本上做xx=未定义+5,这是NaN@grodzi现在我明白了。谢谢。解决方案取决于您需要如何为循环之后的步骤构造数据。例如,您可以拥有一个结果对象,其中每个键对应一种货币。然后您可以说:result[symbolBase+'volumeBought']=lots*100.000我知道这可能很迂腐,但orderType:0不是有效的JSON。你是说JS对象吗?@Phanti你正在序列化对象,所以我的评论无关紧要。很公平。关于你对kastenbutts的编辑,你做错了。如果你看他的代码,他第一次将变量初始化为一个数字。在你的情况下,你不是你基本上做xx=未定义+5,这是NaN@grodzi现在我明白了。谢谢你谢谢你的这种方法。我将努力相应地实施它,并在此基础上再接再厉。hasOwnProperty代表什么?参见:对于这类问题,你应该首先使用搜索引擎。Mozilla和其他人已经很好地记录了HTML/CSS、Javascript。不要害怕阅读这些参考资料。它们通常包含示例,您可以找到许多问题的答案。感谢您的这种方法。我将努力相应地实施它,并在此基础上再接再厉。hasOwnProperty代表什么?参见:对于这类问题,你应该首先使用搜索引擎。Mozilla和其他人已经很好地记录了HTML/CSS、Javascript。不要害怕阅读这些参考资料。它们通常包含示例,你可以找到很多问题的答案。这太酷了。我会调查的。有趣的是,到处都能看到相同问题的不同解决方案。这太酷了。我会调查的。有趣的是,到处都能看到相同问题的不同解决方案。
let resultBought = {}
let resultSold = {}

for (var i = 0; i < tradesTotal; i++) {

symbol = trades[i].fields.orderSymbol
// returns e.g. EUR/USD

symbolBase = symbol.slice(0, 3)
// returns e.g. EUR

symbolCounter = symbol.slice(3, 6)
// returns e.g. USD

lots = trades[i].fields.orderLots
// returns e.g. 1.00

orderType = trades[i].fields.orderType
// orderTypes 0, 2, 4 are long trades, 1, 3, 5 shorts accordingly

// check for major pairs where XXX/YYY = defined currencies
if (symbolBase.match(/^(EUR|GBP|AUD|CHF|JPY|USD|CAD)$/) && symbolCounter.match(/^(EUR|GBP|AUD|CHF|JPY|USD|CAD)$/)) {
    // Long Trades Major Pairs
    if (orderType == '0' || orderType == '2' || orderType == '4') {

        // Base currency
        if(resultBought.hasOwnProperty(symbolBase + 'VolumeBought')) {
            resultBought[symbolBase + 'VolumeBought'] += lots * 100.000
        }
        else {
            resultBought[symbolBase + 'VolumeBought'] = lots * 100.000
        }
        // Counter currency
        if(resultSold.hasOwnProperty(symbolCounter + 'VolumeSold')) {
            resultSold[symbolCounter + 'VolumeSold'] += lots * 100.000
        }
        else {
            resultSold[symbolCounter + 'VolumeSold'] = lots * 100.000
        }

    // Short Trades Major Pairs
    } else if (orderType == '1' || orderType == '3' || orderType == '5') {

        // Base currency
        if(resultSold.hasOwnProperty(symbolBase + 'VolumeSold')) {
            resultSold[symbolBase + 'VolumeSold'] += lots * 100.000
        }
        else {
            resultSold[symbolBase + 'VolumeSold'] = lots * 100.000
        }

        // Counter currency
        if(resultBought.hasOwnProperty(symbolCounter + 'VolumeBought')) {
            resultBought[symbolCounter + 'VolumeBought'] += lots * 100.000
        }
        else {
            resultBought[symbolCounter + 'VolumeBought'] = lots * 100.000
        }
      }
// consider the non major pairs
} else if (symbolBase.match(/^(EUR|GBP|AUD|CHF|JPY|USD|CAD)$/) || symbolCounter.match(/^(EUR|GBP|AUD|CHF|JPY|USD|CAD)$/)) {
    if (orderType == '0' || orderType == '2' || orderType == '4') {

        if(resultBought.hasOwnProperty(symbolBase + 'VolumeBought')) {
            resultBought[symbolBase + 'VolumeBought'] += lots * 100.000
        }
        else {
            resultBought[symbolBase + 'VolumeBought'] = lots * 100.000
        }

    } else if (orderType == '1' || orderType == '3' || orderType == '5') {

        if(resultSold.hasOwnProperty(symbolBase + 'VolumeSold')) {
            resultSold[symbolBase + 'VolumeSold'] += lots * 100.000
        }
        else {
            resultSold[symbolBase + 'VolumeSold'] = lots * 100.000
        }
      }
  }
}