鉴于以下数据结构,根据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;围绕最有效地获取此类值的方法,而不是在set
或update
上的表格中重复冗余数据。
谢谢!
答案 0 :(得分:0)
我只需加载所有级别并选择正确的一个客户端。
我还考虑稍微不同地存储这些级别,因为这些ID似乎会随着时间的推移而受到妨碍:
"levels": {
"exp0": 1
"exp2000": 2
"exp4000": 3
}
你甚至可以考虑在这里使用数组:
"levels": [0, 2000, 4000]
虽然您必须将级别偏移一个,或者使用额外的空白填充:
"levels": [null, 0, 2000, 4000]