Ivan
Ivan

Reputation: 7746

How to declare a Hash/Dictionary of Array

I have a program that pushes values into one data structure like this:

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
    });
}

So this is the key: NOT A STRING!

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

And the values of which are many look like this:

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

 }

The problem is that stocks and calls and puts are being put into one collection. Instead, I want to add the the stocks and their corresponding calls and puts into a dictionary/map, where the stocks are the keys, and the calls and puts get pushed into an array indexed by it's stock.

At the end, I want to be able to iterate and get the keys and values.

Initially I thought the declaration was something like this:

var stockCallsPutDict = {[]}


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

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

Upvotes: 0

Views: 107

Answers (3)

Pango
Pango

Reputation: 673

I'm still not sure I actually understood what your data looks like, but sounds kind of like this to me:

// 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]);
}

Upvotes: 0

Amnon
Amnon

Reputation: 2888

There are a few ways to go about this, and the best depends on how the data needs to be processed later, but from your description I'd go with something along the lines of

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);

Upvotes: 0

edwarddamato
edwarddamato

Reputation: 3260

If ES6 is an option, you can either build an object yourself or use a Map.

Here's some quick code I came up with:

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]
  }
}

OR WITH A MAP

const stocks = new Map();

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

Upvotes: 2

Related Questions