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

时间:2017-07-20 22:34:29

标签: javascript

好的,不能得到这个。我正在尝试将对象属性键: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;
  }

3 个答案:

答案 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变量属于全局范围,您不必一直保存,只需向其中添加属性
  • 如果您希望两个随机属性彼此不同,请在选择第二个之前删除第一个。

&#13;
&#13;
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;
&#13;
&#13;