【发布时间】:2016-05-13 08:12:05
【问题描述】:
我正在处理练习题,并被困在一个基于 jasmine-node 的测试中,它说我应该能够生成 10000 个随机名称而不会发生任何冲突(例如 2 个随机生成的名称匹配)。这是测试:
it('there can be lots of robots with different names each', function() {
var i,
numRobots = 10000,
usedNames = {};
for (i = 0; i < numRobots; i++) {
var newRobot = new Robot();
usedNames[newRobot.name] = true;
}
expect(Object.keys(usedNames).length).toEqual(numRobots);
});
我认为我需要做的是:
- 创建一个数组来保存所有名称 (robotNames),
- 每次生成名称时,检查是否存在于数组中,
- 如果是,生成另一个名称,
- 如果没有,请将其添加到数组中。
这是我目前的代码...
"use strict";
var robotNames = [];
var name;
var Robot = function() {
this.name = this.generateName();
};
Robot.prototype.generateName = function() {
var letters = "";
var alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
var numbers = "";
var digits = "0123456789";
// generate random characters for robot name...
for( var i=0; i < 2; i++ ) {
letters += alphabet.charAt(Math.floor(Math.random() * alphabet.length));
};
for( var i=0; i < 3; i++ ) {
numbers += digits.charAt(Math.floor(Math.random() * digits.length));
};
name = letters+numbers;
// Loop through array to check for duplicates
for(var i = 0; i < robotNames.length; i++) {
if (name == robotNames[i]) {
this.generateName();
return;
} else {
robotNames.push(name);
}
}
return name;
};
Robot.prototype.reset = function() {
this.name = this.generateName();
};
module.exports = Robot;
测试失败并显示错误消息:“预期 9924 等于 10000。”
每次运行测试时,'9924' 数字都会略有不同。我认为这意味着 generateName 函数最终会生成 2 个匹配的随机名称。似乎我的检查重复项的循环没有运行,我不确定为什么。
我尝试了几个不同版本的循环,但都没有成功。所以我的问题是 a) 我的方法是否正确,我的循环语法有问题吗?或者 b) 我对如何在这里检查重复项有错误的想法吗?
感谢任何指点,谢谢。
【问题讨论】:
-
试试这个:
return this.generateName();而不是this.generateName(); return。我打赌你在usedNames中的名字是空的。 -
robotNames.length可能有问题。试试for(var i = 0, len = robotNames.length; i < len; i++)而不是for(var i = 0; i < robotNames.length; i++)。 -
@Kenney - 是的,我不明白我必须在循环中返回 this.generateName(),尽管我只是把 this.generateName() 放了就可以运行这个函数。谢谢!
-
它确实运行了函数,你理解正确 - 但是你的
Robot构造函数会这样做(就像Robot.reset一样):this.name = this.generateName();所以你的测试会得到一个空值newRobot.name.所以有 2 个问题 - 这个问题和 @Emile 指出的关于for循环的问题。
标签: javascript arrays for-loop duplicates