2017-03-08 37 views
0

的我有一個程序,推值轉換成一個數據結構是這樣的:如何聲明一個散列/字典陣列

if(symbolType == "C" || symbolType == "P") // The calls and puts    
    stocks.push({      
     symbol: symbol, 
       undsymbol: undSymbol, 
       open: 0, 
       type: symbolType, 
       expiry: expiry, 
       days: days, 
       strike: strike 

    }); 
}    
else // The stock  
{   
    stocks.push({ 
     symbol: symbol, 
     open: 0, 
     type: symbolType 
    }); 
} 

因此,這是關鍵所在:不是一個字符串!其中

{ 
    symbol: symbol, 
    open: 0, 
    type: symbolType 
} 

,值很多是這樣的:

{      
     symbol: symbol, 
       undsymbol: undSymbol, 
       open: 0, 
       type: symbolType, 
       expiry: expiry, 
       days: days, 
       strike: strike 

} 

的問題是,股票和看漲和看跌期權被放進一個集合。相反,我想添加股票及其相應的調用,並放入字典/地圖中,股票是關鍵字,並且調用和放入被壓入由其股票索引的數組中。

最後,我想能夠迭代並獲取鍵和值。

  • 我如何聲明這個對象
  • 索引,看看是否的關鍵[股票]已經存在,如果它不與空數組添加。
  • 如果我得到一個「C」或「P」,我想得到相應的數組來保存這個鍵[stock]的Calls/Puts,並將這個call/put放到數組中。

起初我還以爲該聲明是這樣的:

var stockCallsPutDict = {[]} 


stockCallsPutDict[stock] = []; 
stockCallsPut[stock].push(call); 

// Pretty print the dict of keys and its options = 
stockCallsPutDict.forEach(function kvp) { 
    ... 
} 
+0

你有這樣的樣本數據嗎? – Pango

+0

爲什麼不使用'Map'? https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map –

+0

Pango - 正在從一個字符串中分析數據,看起來像對象的外觀。這只是一個字符串。所以股票字符串是「IBM,」U「。對於一個選項,它是」IBM,C「,20170317,34,140」 – Ivan

回答

2

線如果ES6是一個選項,您可以自行創建一個對象或使用Map

下面是一些簡單的代碼我想出了:

const stocks = {}; 
const addCallAndPut = callAndPut => { 
    const symbol = callAndPut.symbol; 
    if (!stocks[symbol]) { 
    stocks[symbol] = []; 
    } 
    stocks[symbol].push(callAndPut); 
} 

const showStuff =() => { 
    for (const symbol in stocks) { 
    // output stuff using stocks[symbol] 
    } 
} 

或用MAP

const stocks = new Map(); 

// basic implementation 
const addCallAndPut = callAndPut => { 
    const stockCallsAndPuts = stocks.get(callAndPut.symbol) || []; 
    stockCallsAndPuts.push(callAndPut); 
    stock.set(callAndPut.symbol, stockCallsAndPuts); 
} 
+0

謝謝。這很清楚,我能夠修改這些代碼。 – Ivan

+0

我剛剛意識到的東西,關鍵不是一個字符串,而是一個對象:{ symbol:symbol, open:0, type:symbolType }但我需要該對象散列到對象的符號。 – Ivan

+0

爲什麼你想使用整個對象作爲關鍵?你的情況下'符號'不夠?如果你真的想要使用這個對象,你可能想要對它進行字符串化('JSON.stringify(symbol)')以便將來查找。 – edwarddamato

0

有幾種方法去這一點,最好的取決於如何需要對數據進行後處理,但是從你的說明我的東西走的

var stocks = {}; 
var stockCallsPut = {}; 

// loop over stocks and actions 
    if (!(symbol in stocks)) { 
     stocks[symbol] = []; 
    } 

    if (!(symbol in stockCallsPut)) { 
     stockCallsPut[symbol] = {}; 
    } 

    if (!(symbolType in stockCallsPut[symbol])) { 
     stockCallsPut[symbol][symbolType] = []; 
    } 

    // accumulated stock json items here 
    stocks[symbol].push(new_stock_item); 
    // accumulated push/call json items of stock here 
    stockCallsPut[symbol][symbolType].push(new_action); 
+0

什麼是new_action? – Ivan

+0

@Ivan這是一個電話json或把 – Amnon

+0

啊,現在陷入困境。 – Ivan

0

我仍然不知道我真正瞭解你的數據是什麼樣子,但聽起來有點像我這樣的:

// Not sure if data is an object or array 
var data = { 
    'one': { 
    'name': 'one-somename', 
    'number': 'one-somenumber', 
    'symbol': 'C' 
    }, 
    'two': { 
    'name': 'two-somename', 
    'number': 'two-somenumber', 
    'symbol': 'P' 
    }, 
    'three': { 
    'name': 'three-somename', 
    'number': 'three-somenumber', 
    'symbol': 'C' 
    } 
}; 

var stocks = {}; 

for (var name in data) { 
    // It sounded like you wanted a call/put array for each object but I'm not sure if that's true since it wouldn't be possible... if so can just divide this part up into it's appropriate place in the if statement below 

    // Checking that the property is set on the object, if it is, it uses itself, otherwise it adds it with the call/put arrays created 
    stocks[name] = stocks[name] ? stocks[name] : {'calls': [], 'puts': []}; 
    var type; 

    if (data[name]['symbol'] === 'C') { 
    type = 'calls'; 
    } else if (data[name]['symbol'] === 'P') { 
    type = 'puts'; 
    } 

    stocks[name][type].push(data[name]); 
}