2017-03-08 66 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]); 
}