Javascript 将属性值推送到对象,存储并累加,然后随机选择2
好吧,我没办法。我试图将对象属性key:value'推送到一个空对象,将其存储在一个变量中,然后下一次调用检索更新的对象,并向其添加一个新的key:value对,最后从创建的对象中获取两个不同的随机值。以下是我尝试过的:Javascript 将属性值推送到对象,存储并累加,然后随机选择2,javascript,Javascript,好吧,我没办法。我试图将对象属性key:value'推送到一个空对象,将其存储在一个变量中,然后下一次调用检索更新的对象,并向其添加一个新的key:value对,最后从创建的对象中获取两个不同的随机值。以下是我尝试过的: var obj {}; var storedObject; var randomResponse1 = pickRand1(obj); var randomResponse2 = pickRand1(obj); //first visit to server if (ev
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;
}
var obj{};
var-storedObject;
var randomResponse1=pickRand1(obj);
var randomResponse2=pickRand1(obj);
//首次访问服务器
如果(event.reply==“true”){
obj.1=‘一’;
obj=存储对象;
}
//第二次访问服务器
如果(event.reply==“true”){
对象2=两个;
obj=存储对象;
}
//第三次访问服务器
如果(event.reply==“true”){
对象3=三个;
obj=存储对象;
}
//第四次访问服务器
如果(event.reply==“true”){
对象4=四个;
obj=存储对象;
}
//对服务器的最后访问
如果(event.reply==“true”){
警报(randomResponse1);//它似乎只获取最后一个值
警报(randomResponse2);//另外,这是否有可能
//是相同的随机结果吗?
}
功能选择器1(obj){
var结果;
var计数=0;
用于(obj中的var prop)
if(Math.random()<1/++count)
结果=obj[prop];
返回结果;
}
您要做的是设置一个属性,如obj.1='one'
(更不用说它不是有效的语法),然后将storedObject
分配给obj
,这将使其与storedObject
完全相同,放弃对obj
的任何先前更改
你需要的是这样的东西:
obj[1] = 'one'
obj = Object.assign(obj, storedObject)
这将把obj
内容与storedObject
内容合并,并将结果保存到obj
PS:声明需要如下
var obj={}
。在查找功能问题之前,请确保修复了所有语法错误。如果不能够测试代码,很难确定问题出在哪里,但我发现了一些可能导致您出现问题的因素
首先,Javascript对象的点表示法仅适用于有效标识符,不能以数字开头。我将您的代码切换为使用括号表示法,它确实适用于所有有效字符串,例如obj[“1”]
我还编辑了你的随机函数。在原始函数中,似乎有1/1的机会选择第一个键,1/2的机会选择第二个键,依此类推。新函数的工作原理是将obj
转换为一个数组,然后为数组选择一个随机索引,这反过来会给我们一个随机键。此外,正如Derek善意地提到的,您缺少了原始for循环中的括号:)
最后,在注释中回答您的问题:是的,对随机函数的两个调用都可能返回同一个对象(但这很容易更改)
我在下面附上了一段代码片段和我的编辑。让我知道这是否有帮助
注意:我不确定您在这段代码中使用的是什么框架/库/等等,但是如果现在这样做的话,您的所有if语句都将在第一次访问服务器时运行。我认为您需要实现某种排队系统,以确保if语句将在单独的访问中运行
let obj{};
让存储对象;
设randomResponse1=pickRand1(obj);
设randomResponse2=pickRand1(obj);
//首次访问服务器
如果(event.reply==“true”){
obj[“1”]=“一”;
obj=存储对象;
}
//第二次访问服务器
如果(event.reply==“true”){
obj[“2”]=“两个”;
obj=存储对象;
}
//第三次访问服务器
如果(event.reply==“true”){
obj[“3”]=“三”;
obj=存储对象;
}
//第四次访问服务器
如果(event.reply==“true”){
obj[“4”]=“四”;
obj=存储对象;
}
//对服务器的最后访问
如果(event.reply==“true”){
警报(randomResponse1);//它似乎只获取最后一个值
警报(randomResponse2);//另外,这是否有可能
//是相同的随机结果吗?
}
功能选择器1(obj){
设keys=Object.keys(obj);
设numKeys=keys.length;
让randomIndex=Math.floor(Math.random()*numKeys);
设randomKey=keys[randomIndex];
让结果=obj[随机键];
返回结果;
}
这里并不是非常清楚你想要实现什么,但要记住
- 不要测试
相反,如果您的值计算为布尔值,只需测试if(val==“true”)
if(val)
- 您的
变量位于全局范围内,您不必一直保存它,只需向其添加属性即可obj
- 如果希望两个随机特性彼此不同,请先删除第一个,然后再选择第二个
var事件={
答复:对
};
var obj={};
//首次访问服务器
if(event.reply){
obj.a=‘一’;
}
//第二次访问服务器
if(event.reply){
obj.b=‘两个’;
}
//第三次访问服务器
if(event.reply){
obj.c=‘三’;
}
//第四次访问服务器
if(event.reply){
obj.d=‘四’;
}
//第五次访问服务器
if(event.reply){
var arr=对象键(obj);
var i=数学地板(数学随机()*arr.length);
var key=arr[i];
console.log(obj[key])
删除obj[key];
arr=对象键(obj);
i=数学地板(数学随机()*arr.length);
key=arr[i];
console.log(obj[key]);
}
这甚至不是有效的JavaScript语法。请提供工作代码来说明问题。发布的代码存在多个问题,包括语法问题和逻辑问题。如果你不能让它运行,询问你遇到的错误。是的,可以。很抱歉。我不太流利,只是为了概念性地掌握它而匆匆忙忙地读了一遍。我一有机会就会更新它。