2017-06-07 7 views
-3

誰かが私に助けてくれますか?私は以下のコード行を理解できません。私はこのコードをデバッグするのに数時間を費やしていますが、私は修正できません。Javascript配列オブジェクト出力

var data = [ 
    {"name":"123123123123"}, 
    {"name":"123123123124"}, 
    {"name":"123123123125"}, 
    {"name":"123123123126"} 
]; 
var x1 = {} 
var basicS = { 
    "question":[] 
} 
data.forEach(function(val,i){ 
    x1[val.name]=basicS; 
}); 

console.log(x1); 
data.forEach(function(val,i){ 
x1[val.name].question.push('insert'); 
}); 
console.log(x1); 

出力:

{ 
123123123123:{ 
    question:[ 
     0:"insert" 
     1:"insert" 
     2:"insert" 
     3:"insert" 
    ] 
}, 
123123123124:{ 
    question:[ 
     0:"insert" 
     1:"insert" 
     2:"insert" 
     3:"insert" 
    ] 
}, 
123123123125:{ 
    question:[ 
     0:"insert" 
     1:"insert" 
     2:"insert" 
     3:"insert" 
    ] 
}, 
123123123126:{ 
    question:[ 
     0:"insert" 
     1:"insert" 
     2:"insert" 
     3:"insert" 
    ] 
} 
} 

予想される出力は次のようになります。

私は一つだけを挿入していながら、四つの値は、各質問の配列内に挿入されているところから理解することができ
{ 
    123123123123:{ 
    question:[ 
     0:"insert" 
    ] 
}, 
123123123124:{ 
    question:[ 
     0:"insert" 
    ] 
}, 
123123123125:{ 
    question:[ 
     0:"insert" 
       ] 
}, 
123123123126:{ 
    question:[ 
     0:"insert" 
    ] 
} 
} 

ありません各質問 配列オブジェクト。

このタイプの問題を解決する方法はありますか?

私を助けてください。私は全く混乱している。前もって感謝します。

+1

を使用すると、結果が見えるように期待しますか?あなたがここでやろうとしていることはまったく明確ではありません。 – JLRishe

+1

'x1 [val.name]'は同じ 'basicS'オブジェクトを指しています。したがって、各反復では、基本的に同じオブジェクトに値を挿入しています。 javascriptでのオブジェクトの割り当ては、参照時にのみ参照されます。割り当て中は、オブジェクトの新しい参照ではなく参照が割り当てられます – abhishekkannojia

+0

どのように見えますか? – Rick

答えて

0

あなたが複数のオブジェクトを作成することもできます。

data.forEach(function(val,i){ 
    x1[val.name]={ 
     "question":[] 
    }; 
}); 

またはその代わりにO(2N)の1 O(n)の中に両方のループ:

data.forEach(function(val,i){ 
    (x1[val.name]=x1[val.name] || {question:[]}).question.push(val); 
}); 
+0

ありがとう@ジョナスw私は間違いを犯しました。指摘してくれてありがとう。 –

+0

@Mohut Bhagwani youre welcome;)どこかで緑色のチェックマークを押してください。 –

0

これはx1内のすべての値ので、何が起こっていますと同じbasicS配列を参照しています。だからあなたはinsertをその配列に4回押し込んでいます。

var data = [ 
 
    {"name":"123123123123"}, 
 
    {"name":"123123123124"}, 
 
    {"name":"123123123125"}, 
 
    {"name":"123123123126"} 
 
]; 
 
var x1 = {} 
 

 
data.forEach(function(val,i){ 
 
    x1[val.name]= { "question": [] }; 
 
}); 
 

 
data.forEach(function(val,i){ 
 
x1[val.name].question.push('insert'); 
 
}); 
 
console.log(x1);

それとも、あなたが最終的にやろうとしているものに応じて、あなただけで配列を移入できます。これを避けるには

x1で新しい配列を各項目を与えます代わりに二回ループの彼らの初期値:

var data = [ 
 
    {"name":"123123123123"}, 
 
    {"name":"123123123124"}, 
 
    {"name":"123123123125"}, 
 
    {"name":"123123123126"} 
 
]; 
 
var x1 = {} 
 

 
data.forEach(function(val,i){ 
 
    x1[val.name] = { "question": ["insert"] }; 
 
}); 
 

 
console.log(x1);

+0

ありがとう@JLRishe。私の間違いを指摘するために。実際に挿入するのは単なるサンプルで、私はAPIからの質問をたくさん挿入する必要があります。 –

+0

これを落とした人がなぜその理由を説明できますか? –

0

簡単にしてください。

新しいオブジェクトをコンテナとして使用して挿入します。 混乱を避けるために、 "forEach"から "for"ループに切り替えます。 参照のためにすべての反復で配列の新しいインスタンスを作成します。 インデックスを0に設定して挿入します。オブジェクトを反復で作成し、名前プロパティ値を設定します。 はその後キーであなたの配列に設定質問プロパティを持つオブジェクトに割り当てる「0」

var data = [{ 
 
    "name": "123123123123" 
 
    }, 
 
    { 
 
    "name": "123123123124" 
 
    }, 
 
    { 
 
    "name": "123123123125" 
 
    }, 
 
    { 
 
    "name": "123123123126" 
 
    } 
 
]; 
 

 
var obj = {}; 
 

 
for (var i = 0; i < data.length; i++) { 
 

 
    var insert = []; 
 
    
 
    insert['0'] = 'insert'; 
 
    
 
    obj[data[i].name] = { 
 
    question: insert 
 
    } 
 
    
 
}; 
 

 
console.log(obj);

+0

答えのために@Arrowに感謝します。アドバイスを受けました。 –

関連する問題