Javascript 如何声明数组的哈希/字典

Javascript 如何声明数组的哈希/字典,javascript,arrays,dictionary,Javascript,Arrays,Dictionary,我有一个程序,它将值推送到一个数据结构中,如下所示: if(symbolType == "C" || symbolType == "P") // The calls and puts stocks.push({ symbol: symbol, undsymbol: undSymbol, open: 0, ty

我有一个程序,它将值推送到一个数据结构中,如下所示:

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,
                undsymbol: undSymbol,
                open: 0,
                type: symbolType,
                expiry: expiry,
                days: days,
                strike: strike

 }
var stockCallsPutDict = {[]}


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

// Pretty print the dict of keys and its options =
stockCallsPutDict.forEach(function kvp) {
   ...
}
这就是关键:不是字符串

{
    symbol: symbol,
    open: 0,
    type: symbolType
}
其中的许多值如下所示:

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,
                undsymbol: undSymbol,
                open: 0,
                type: symbolType,
                expiry: expiry,
                days: days,
                strike: strike

 }
var stockCallsPutDict = {[]}


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

// Pretty print the dict of keys and its options =
stockCallsPutDict.forEach(function kvp) {
   ...
}
问题在于,股票、看涨期权和看跌期权被放在一个集合中。相反,我想将股票及其对应的调用和put添加到一个字典/地图中,其中股票是键,调用和put被推送到一个由股票索引的数组中。

最后,我希望能够迭代并获取键和值

  • 如何声明此对象
  • 索引到其中,查看键[stock]是否已经存在,如果它没有使用空数组添加它
  • 如果我得到一个“C”或“P”,我想得到对应的数组,该数组保存该键[stock]的调用/输入,并将调用/输入推送到数组中
起初我认为宣言是这样的:

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,
                undsymbol: undSymbol,
                open: 0,
                type: symbolType,
                expiry: expiry,
                days: days,
                strike: strike

 }
var stockCallsPutDict = {[]}


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

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

有几种方法可以做到这一点,最好的方法取决于以后需要如何处理数据,但根据您的描述,我将采用以下方法:

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

有几种方法可以做到这一点,最好的方法取决于以后需要如何处理数据,但根据您的描述,我将采用以下方法:

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

如果ES6是一个选项,您可以自己构建一个对象,也可以使用
映射

下面是我想到的一些快速代码:

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]
  }
}
或使用地图


如果ES6是一个选项,您可以自己构建一个对象,也可以使用
映射

下面是我想到的一些快速代码:

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]
  }
}
或使用地图


我仍然不确定我是否真正理解了您的数据,但在我听来有点像这样:

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

我仍然不确定我是否真正理解了您的数据,但在我听来有点像这样:

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


您有用于此的示例数据吗?为什么不使用
Map
?Pango-数据是从字符串中解析出来的,看起来像对象的样子。它只是一根线。股票字符串是“IBM,U”。对于期权,它是“IBM,C”,20170317,34,140”-乔纳森,这个例子让我更接近。让我困惑的是,键不是一个字符串,而是一个股票对象。您有用于此的示例数据吗?为什么不使用
Map
?Pango-数据是从字符串中解析出来的,看起来像对象的样子。它只是一根线。股票字符串是“IBM,U”。对于期权,它是“IBM,C”,20170317,34,140”-乔纳森,这个例子让我更接近。让我困惑的是,关键不是一个字符串,而是一个股票对象。什么是新动作?@Ivan这是呼叫或putAh的json,现在就知道了。什么是新动作?@Ivan这是呼叫或putAh的json,现在就知道了。谢谢。这很清楚,我能够修改这段代码。我刚刚意识到,键不是一个字符串,而是一个对象:{symbol:symbol,open:0,type:symbolType}但我需要该对象散列到对象的符号。为什么要使用整个对象作为键?在您的情况下,
symbol
是否足够?如果你真的想使用这个对象,你可能需要字符串化(
JSON.stringify(symbol)
)来简化将来的查找。因为我以后在迭代键时需要整个对象!我可能需要创建一个类并重载哈希函数。我从来没有在javascript中这样做过。我的观点是,
符号的属性
也是正在存储的
调用和放置
的属性,因此您可以在迭代时获得这些值。谢谢。这很清楚,我能够修改这段代码。我刚刚意识到,键不是一个字符串,而是一个对象:{symbol:symbol,open:0,type:symbolType}但我需要该对象散列到对象的符号。为什么要使用整个对象作为键?在您的情况下,
symbol
是否足够?如果你真的想使用这个对象,你可能需要字符串化(
JSON.stringify(symbol)
)来简化将来的查找。因为我以后在迭代键时需要整个对象!我可能需要创建一个类并重载哈希函数。我从来没有在javascript中这样做过。我的观点是,
符号的属性
也是正在存储的
调用和put
的属性,因此可以在迭代时获取这些值。