我有一个键和值的列表。例如:
keys = ["keyA", "keyB", "keyC"];
value = 100;
Run Code Online (Sandbox Code Playgroud)
我正在尝试创建一个函数来创建地图,以便:
map["keyA"]["keyB"]["keyC"] = 100;
Run Code Online (Sandbox Code Playgroud)
根据此处给出的答案,我认为这是最好的数据结构:
不管怎样,对我来说挑战的部分是我需要一个可以为任意数量的键创建映射的函数。我尝试过循环执行此操作,但无法使其工作,因为我不知道如何访问地图的不同级别,但它也感觉很草率:
for(var i=0; i<keys.length; i++){
for(var j=0; j<i; j++){
maps[keys[0]]...[keys[j]] = {};
if(j+1 === i){
maps[keys[0]]...[keys[j]][keys[i]] = value;
}
}
}
Run Code Online (Sandbox Code Playgroud)
如何创建我的地图?
我有两条路线通向相同的视图和控制器(即我只是传入一个 id 以在 $routeParams 中访问并在其上执行控制器逻辑):
$routeProvider
.when('/about',
{
controller: 'AboutController',
controllerAs: 'vm',
templateUrl: 'about.html'
})
.when('/about/:id',
{
controller: 'AboutController',
controllerAs: 'vm',
templateUrl: 'about.html'
});
Run Code Online (Sandbox Code Playgroud)
这感觉非常重复。有没有速记之类的?
$routeProvider
.when(['/about', '/about/:id'],
{
controller: 'AboutController',
controllerAs: 'vm',
templateUrl: 'about.html'
})
Run Code Online (Sandbox Code Playgroud) 如果您在Stackoverflow上搜索如何在JS中缓存变量,您将找到指向cookie或本地存储的答案.
另一方面,"缓存"这个词通常用作:"缓存数组的长度,这样我们就不必每次都计算它".
当然,我们不会在cookie或本地存储中缓存长度.我的问题是:
"缓存"长度的位置在哪里?它在记忆中吗?如果是这样,为什么我们使用"缓存"这个词?
为了计算斐波那契数列的第 n 项,我使用熟悉的递归函数:
var fibonacci = function(index){
if(index<=0){ return 0; }
if(index===1){ return 1; }
if(index===2){ return 2; }
return fibonacci(index-2) + fibonacci(index-1);
}
Run Code Online (Sandbox Code Playgroud)
这按预期工作。现在,我尝试将计算出的索引存储在对象中:
var results = {
0: 0,
1: 1,
2: 2
};
var fibonacci = function(index){
if(index<=0){ return 0; }
if(index===1){ return 1; }
if(index===2){ return 2; }
if(!results[index]){
results[index] = fibonacci(index-2) + fibonacci(index-1);
}
}
Run Code Online (Sandbox Code Playgroud)
我知道这实际上并没有提高性能,因为我没有访问结果对象,但我想在记忆之前首先检查我的结果对象是否已正确填充。不幸的是,事实并非如此。对于斐波那契(9),我得到:
Object {0: 0, 1: 1, 2: 2, 3: 3, 4: NaN, 5: NaN, 6: NaN, 7: NaN, 8: NaN, …Run Code Online (Sandbox Code Playgroud) 当我在服务器上收到发布请求以创建新游戏时,我会执行几个查询.首先,我搜索用户是否已经在游戏中,如果是,则返回游戏.否则,我搜索一个开放的游戏,其中某人正在等待对手并返回该游戏,如果是这样的话.最后,如果没有找到上述状态的游戏,我会创建一个新游戏并返回.所以我的代码看起来像这样:
.post( function(req, res, next){
...findUsersExistingGame...
.then(function(game){
if(game){ return res.send(game); }
else{
return ...findUserWaitingForOpponentsGame...
}
}
.then(function(game){
if(game){ return res.send(game); }
else{
return ...createNewGame...
}
})
.then(function(game){
return res.send(game);
})
.catch(function(err){
return next(err);
});
Run Code Online (Sandbox Code Playgroud)
我最终会将每个函数重构为辅助函数以提高可读性,但我需要首先弄清楚链接.我的问题是,如果我找到一个游戏中的承诺早链(即有两种用户的现有游戏或谁是等待对手的另一个用户)然后我返回res.send(游戏); 但是,第三个.then将抛出一个错误,因为我之前的.then()语句返回undefined.如果我想做一个res.send(游戏),我如何早早退出承诺链?
选项1:我已经看到了抛出错误并明确捕获它的建议,但这种感觉从根本上说是错误的,使用错误来控制流量.
选项2:我可以做类似的事情而不是链接承诺,但这类似于"承诺/回调地狱":
.post( function(req, res, next){
...findUsersExistingGame...
.then(function(game){
if(game){ return res.send(game); }
else{
...findUserWaitingForOpponentsGame...
.then(function(game){
if(game){ return res.send(game); }
else{
return ...createNewGame...
.then(function(game){
return res.send(game);
});
}
})
}
}
Run Code Online (Sandbox Code Playgroud)
还有另一种方式(最好是在ES5中,因为我仍然试图从根本上理解承诺,但ES6的答案也是受欢迎的)?
javascript ×4
angularjs ×1
caching ×1
es6-promise ×1
express ×1
fibonacci ×1
node.js ×1
promise ×1
recursion ×1