【问题标题】:Hash Tables in javascriptjavascript中的哈希表
【发布时间】:2013-06-07 16:27:16
【问题描述】:

我正在尝试构建数据结构。

在我有限的知识中,“哈希表”似乎是要走的路。如果您认为有更简单的方法,请提出建议。

我有两个一维数组:-

A[] - 包含徽章(成就)的名称

B[] - 包含从数组 A[] 中完成这些成就的相应日期。

一项成就/成就/徽章可以完成多次。

因此两个数组的样本:-

A['scholar', 'contributor', 'teacher', 'student', 'tumbleweed', 'scholar'.....,'scholar',......]

B['1/2010', '2/2011', '3/2011', '6/2012', '10/2012', '2/2013',......'3/ 2013',........]

我想用我的数据结构实现的是:-

唯一键列表(eq:- 'scholar')及其所有现有值(数组 B[] 中的日期)。

因此我的最终结果应该是:-

({'scholar': '1/2010', '2/2013', '3/2013'}), ({'contributor' : ........})..... .....

这样我可以挑选出一个唯一键,然后遍历它的所有唯一值,然后使用它们在 x-y 网格上绘图。 (y 轴标签是唯一的徽章名称,x 轴是日期,有点像时间线。)

谁能指导我如何构建这样的数据结构?

以及如何从创建的数据结构中访问键.... 授予我不知道有多少键以及它们各自的值是什么。这些键的分配是动态的,因此编号和名称各不相同。

【问题讨论】:

标签: javascript hashtable


【解决方案1】:

您的最终对象结构如下所示:

{
    'scholar': [],
    'contributor': []
}

要构建它,遍历 names 数组并构建最终结果:如果最终结果包含键,则将相应的日期推入其值,否则将新键设置为包含其相应日期的数组。

类似:

var resultVal = {};
for(var i = 0; i < names.length; ++i) {
    if(resultVal[names[i]]) {
        resultVal[names[i]].push(dates[i]);
    } else {
        resultVal[names[i]] = [dates[i]];
    }
}

访问结果 - 遍历所有值:

for(var key in resultVal) {
    var dates = resultVal[key];

    for(var i = 0; i < dates.length; ++i) {
       // you logic here for each date
       console.log("resultVal[" + key + "] ==> " + resultVal[key][i]);
    }
}

会给出如下结果:

resultVal[scholar] ==> 1/2010
resultVal[scholar] ==> 2/2013
resultVal[scholar] ==> 3/2013
resultVal[contributor] ==> 2/2011
resultVal[teacher] ==> 3/2011
resultVal[student] ==> 6/2012
resultVal[tumbleweed] ==> 10/2012

【讨论】:

  • 然后我如何访问每个单独的密钥?注意:我不知道有多少键,甚至不知道它们的唯一名称。可能有 a,b,x,y,z 或 a,b,c,d,e,f,g。徽章的名称。
  • key 是保留字吗?因为就像我说的,我不知道每个键的各个值……键值是动态分配的。目前,当我在 resultVal {} 上放置断点时。我可以看到它有日期,但我看不到名称...它的 {object},{array} 格式。
  • key 不是关键字 - 它只是一个变量。 for(foo in bar) 的构造将遍历对象的所有键(无论如何都可以迭代的键)。
  • 一个问题:- 当我这样做时,我的第一个徽章的 dates.length 而不是 16 个日期,我得到 361 ......虽然日期显示它有 16 个元素......哈哈。
  • @Philo:要了解有关对象以及如何访问它们的更多信息,请查看我已经推荐给您的链接:developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/…。它有很多例子。
【解决方案2】:

你可以试试这个……

var A = ['scholar', 'contributor',
  'teacher', 'student', 'tumbleweed', 'scholar','scholar'];

var B = ['1/2010', '2/2011', 
  '3/2011', '6/2012', '10/2012', '2/2013','3/2013'];

var combined = {};

for(var i=0;i<A.length;i++) {
  if(combined[A[i]] === undefined) {
    combined[A[i]] = [];
  }
  combined[A[i]].push(B[i]);
}

那么combined中的每一个数组都可以通过

combined.scholar[0]

combined['scholar'][0]

在与undefined 进行比较时,请注意===

【讨论】:

  • 除了,我不知道所有徽章的名字('scholar')。所以我不能像组合['scholar']一样访问。我需要访问:组合 [keyof ith position],给我它的 0...n 值。
  • dc5 的编辑展示了如何做到这一点。这里的第二个答案...stackoverflow.com/questions/18912/how-to-find-keys-of-a-hash 也显示了另一种方法。
猜你喜欢
  • 2016-08-04
  • 2010-10-02
  • 1970-01-01
  • 2012-03-09
  • 1970-01-01
  • 1970-01-01
  • 2014-03-03
  • 2012-08-23
  • 2013-09-10
相关资源
最近更新 更多