2017-07-20 2 views
0

いいえ、これを取得できません。私は、オブジェクトのプロパティキーを押してみようとしています:空のオブジェクトに値を格納し、それを変数に格納してから、次の呼び出しでその更新されたオブジェクトを取得し、新しいキーを追加しようとしています。作成されたオブジェクトからここで私が試したものです:オブジェクトにプロパティ値をプッシュストアし、蓄積し、次にランダムに選択します。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; 
    } 
+1

これでも有効なJavaScript構文ではありません。 –

+0

問題を説明するための作業コードを入力してください。ポストされたコードには、構文的にも論理的にも複数の問題があります。走らせることができない場合は、遭遇したエラーについて質問してください。 – traktor53

+0

そうです。申し訳ありません。私はあまりにも流暢ではないと概念的に把握するためにそれを介して急いでいる。私はチャンスを得るとすぐにそれを更新します。 –

答えて

0

何がobj.1 = 'one'のようなプロパティを設定されているのstoredObjectとして、それはまったく同じになりますどのその後、objstoredObjectを割り当て、(それは有効な構文ではありませんことは言うまでもありません)以前の変更を廃棄してobjにします。これはstoredObjectコンテンツとobjコンテンツをマージしてobjに結果を保存します

obj[1] = 'one' 
obj = Object.assign(obj, storedObject) 

:あなたの代わりに必要なもの

はこのようなものです。

PS:宣言はこのvar obj = {}ようにする必要があります。機能上の問題を探す前に、すべての構文ミスを修正してください。

0

これは、コードをテストできず、問題が何であるか確かに言うのは難しいですが、私はあなたの問題を引き起こしている可能性がありますいくつかのことを発見しました。 JavaScriptのオブジェクトと

まず、ドット表記は、数字で始めることはできません有効な識別子で動作します。あなたのコードを、ブラケット表記を使用するように変更しました。これは、すべての有効な文字列で機能します。 obj["1"]

あなたのランダム関数も編集しました。元の関数では、最初のキーを選択する1/1のチャンス、2番目のキーを選択する1/2などのように見えます。新しい関数は、objを配列に変換し、配列のランダムなインデックスを選択することで動作します。ランダムなインデックスはランダムなキーを返します。また、Derekが親切に言及したように、元のfor-loopの括弧が欠落していました。

最後に、コメントであなたの質問に答えるために:はい、random関数の両方の呼び出しが同じオブジェクト(しかし、それは簡単に変更することができます)。

下記の編集内容のコードスニペットを添付しました。これが役に立ったら教えてください!

注:私は、フレームワーク/ライブラリの/ etcあなたは、このコードを使用しているかわからないんだけど、サーバーへの最初の訪問で実行されます、今の道を与え、あなたの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; 
 
    }

0

あなたがここに実現が、心に留めしようとしているものをスーパー明確ではありませんでした。

  • あなたの値はブール値に評価された場合だけ、テストif(val)
  • 、代わりにif(val == "true")をテストしていない、あなたのobj変数がグローバルスコープ内にある、あなたはそれを保存しておく必要はありません、あなただけ追加することができますそれにプロパティー
  • 2つのランダムなプロパティーを異ならせたい場合は、2つ目のランダムプロパティーを選択する前に最初のプロパティーを削除してください。

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]); 
 
}

関連する問題