如何正确计算子数据?

时间:2017-02-05 18:44:49

标签: javascript angular firebase firebase-realtime-database angularfire2

鉴于以下数据结构,根据level为每个character获取experience的最有效方法是什么?我知道我可以level与其他属性存储在一起,但希望有一种方法可以不这样做。

{
  "characters": {
    "-k1239748": {
      "name": "Ada",
      "experience": 0
    },
    "-k827493": {
      "name": "Beth",
      "experience": 2331
    },
    "-k344432": {
      "name": "Carol",
      "experience": 4789
    }
  },
  "levels": {
    "-k123433": {
      "level": 1
      "minimumExperience": 0
    },
    "-k412312": {
      "level": 2
      "minimumExperience": 2000
    },
    "-k113433": {
      "level": 3
      "minimumExperience": 4000
    }
  }
}

预期输出为:

ada.level = 1
beth.level = 2
carol.level = 3

我的假设是,没有比:

更简单的方法了
  • 抓取characters
  • 列表
  • 抓取levels区块中的complete列表
  • 迭代每个character并将character.level属性分配给我从某个函数中获取的任何内容,我将其称为getLevelForExperience(experience)

我发现这有点乏味和不必要,特别是当我来自SQL时我可以做JOIN,或者在C#中有一些可以从函数中获取值的计算属性只在需要时等。

我正在寻找的是执行以下操作的语法:

this.af.database.list('/characters')
  .map(characterResult => {
    this.af.database.list('/levels').startAt(result.experience).first()
      .subscribe(levelResult => {
        result.level = levelResult;
      });

    return characterResult;
  });

我在上面的块中间使用了一些伪代码,因为我不确定哪个适合哪个地方,而且我不知道这是正确的方法,但我只能&可以#39;围绕最有效地获取此类值的方法,而不是在setupdate上的表格中重复冗余数据。

谢谢!

1 个答案:

答案 0 :(得分:0)

我只需加载所有级别并选择正确的一个客户端。

我还考虑稍微不同地存储这些级别,因为这些ID似乎会随着时间的推移而受到妨碍:

"levels": {
  "exp0": 1
  "exp2000": 2
  "exp4000": 3
}

你甚至可以考虑在这里使用数组:

"levels": [0, 2000, 4000]

虽然您必须将级别偏移一个,或者使用额外的空白填充:

"levels": [null, 0, 2000, 4000]