好的,不能得到这个。我正在尝试将对象属性键: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;
}
答案 0 :(得分:0)
你正在做的是设置像obj.1 = 'one'
这样的属性(更不用说它不是一个有效的语法),然后将storedObject
分配给obj
,这将使它与storedObject
放弃对obj
的任何先前更改。
你需要的是这样的东西:
obj[1] = 'one'
obj = Object.assign(obj, storedObject)
这会将obj
内容与storedObject
内容合并,并将结果保存到obj
。
PS:声明需要像var obj = {}
一样。在查找功能问题之前,请确保修复所有语法错误。
答案 1 :(得分:0)
如果不能测试代码,很难确定问题是什么,但我发现了一些可能导致问题的事情。
首先,带有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;
}
答案 2 :(得分:0)
你在这里想要达到的目标并不是很清楚,但请记住;
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]);
}
&#13;