Javascript 将属性值推送到对象,存储并累加,然后随机选择2

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

好吧,我没办法。我试图将对象属性key:value'推送到一个空对象,将其存储在一个变量中,然后下一次调用检索更新的对象,并向其添加一个新的key:value对,最后从创建的对象中获取两个不同的随机值。以下是我尝试过的:

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语法。请提供工作代码来说明问题。发布的代码存在多个问题,包括语法问题和逻辑问题。如果你不能让它运行,询问你遇到的错误。是的,可以。很抱歉。我不太流利,只是为了概念性地掌握它而匆匆忙忙地读了一遍。我一有机会就会更新它。