好的,不能得到这个。我正在尝试将对象属性 key:value' 推送到一个空对象,将其存储在变量中,然后下次调用检索该更新的对象,并向其添加新的键:值对,然后最终从创建的对象中获取 2 个不同的随机值。这是我尝试过的:
var obj {};
var storedObject;
var randomResponse1 = pickRand1(obj);
var randomResponse2 = pickRand1(obj);
//first visit to server
if (event.reply == "true") {
obj.1 = 'one';
obj = storedObject;
}
//second visit to server
if (event.reply == "true") {
obj.2 = 'two';
obj = storedObject;
}
//third visit to server
if (event.reply == "true") {
obj.3 = 'three';
obj = storedObject;
}
//fourth visit to server
if (event.reply == "true") {
obj.4 = 'four';
obj = storedObject;
}
//final visit to server
if (event.reply == "true") {
alert(randomResponse1); //it only seems to grab last value
alert(randomResponse2); //also, does this have a chance of
//being the same random result?
}
function pickRand1(obj) {
var result;
var count = 0;
for (var prop in obj)
if (Math.random() < 1/++count)
result = obj[prop];
return result;
}
如果没有能够测试代码,很难确定问题是什么,但我发现了一些可能导致您的问题的原因。
首先,带有 Javascript 对象的点表示法仅适用于有效的标识符,不能以数字开头。我将您的代码切换为使用括号表示法,它适用于所有有效字符串,例如obj["1"]
.
我还编辑了您的随机函数。在您的原始函数中,似乎您有 1/1 的机会选择第一个键,1/2 的机会选择第二个键,依此类推。新函数的工作原理是将obj
转换为数组,然后为数组选择一个随机索引,这反过来又会给我们一个随机键。此外,正如 Derek 善意地提到的那样,您缺少原始 for 循环:)上的括号
最后,在评论中回答您的问题:是的,对随机函数的两次调用都可能返回相同的对象(但这可以很容易地更改(。
我在下面附上了我的编辑代码片段。让我知道这是否有帮助!
注意:我不确定您在此代码中使用了哪些框架/库/等,但考虑到现在的方式,您的所有 if 语句都将在第一次访问服务器时运行。我认为您需要实现某种排队系统,以确保 if 语句将在单独的访问中运行。
let obj {};
let storedObject;
let randomResponse1 = pickRand1(obj);
let randomResponse2 = pickRand1(obj);
//first visit to server
if (event.reply == "true") {
obj["1"] = 'one';
obj = storedObject;
}
//second visit to server
if (event.reply == "true") {
obj["2"] = 'two';
obj = storedObject;
}
//third visit to server
if (event.reply == "true") {
obj["3"] = 'three';
obj = storedObject;
}
//fourth visit to server
if (event.reply == "true") {
obj["4"] = 'four';
obj = storedObject;
}
//final visit to server
if (event.reply == "true") {
alert(randomResponse1); //it only seems to grab last value
alert(randomResponse2); //also, does this have a chance of
//being the same random result?
}
function pickRand1(obj) {
let keys = Object.keys(obj);
let numKeys = keys.length;
let randomIndex = Math.floor(Math.random() * numKeys);
let randomKey = keys[randomIndex];
let result = obj[randomKey];
return result;
}
目前还不清楚您在这里要实现的目标,但请记住;
- 不要测试
if( val == "true" )
相反,如果您的值计算结果为布尔值,只需测试if( val )
- 您的
obj
变量在全局范围内,您不必继续保存它,您只需向其添加属性即可 - 如果希望两个随机属性彼此不同,请在选择第二个之前删除第一个。
var event = {
reply: true
};
var obj = {};
//first visit to server
if (event.reply) {
obj.a = 'one';
}
//second visit to server
if (event.reply) {
obj.b = 'two';
}
//third visit to server
if (event.reply) {
obj.c = 'three';
}
//fourth visit to server
if (event.reply) {
obj.d = 'four';
}
//fifth visit to server
if (event.reply) {
var arr = Object.keys(obj);
var i = Math.floor(Math.random() * arr.length);
var key = arr[i];
console.log(obj[key])
delete obj[key];
arr = Object.keys(obj);
i = Math.floor(Math.random() * arr.length);
key = arr[i];
console.log(obj[key]);
}
您正在做的是设置像obj.1 = 'one'
这样的属性(更不用说它不是有效的语法(,然后将storedObject
分配给obj
这将使它与storedObject
丢弃任何先前对obj
所做的更改完全相同。
相反,您需要的是这样的东西:
obj[1] = 'one'
obj = Object.assign(obj, storedObject)
这会将obj
内容与storedObject
内容合并,并将结果保存到obj
。
PS:声明需要像这样var obj = {}
.确保在查找功能问题之前修复所有语法错误。