1

複数の行を作成するために拡張する必要がある単一の入力行があり、各行で6つのフィールドが繰り返され、各行に1つの一意のフィールドが追加されています。一意のフィールドはarrparentjobs配列に格納されており、一意の値があることを私は知っています。

コードを実行すると、結果の行にはすべてまったく同じデータが含まれます。これは、最後にプッシュされたアイテムの値です。

私はここで何が間違っているのですか?

どうもありがとう、ジョー

var dataRowsOutput = [];
arrVolDataOutput.playerid = volDataRow.playerId;
arrVolDataOutput.timestamp = volDataRow.timestamp;
arrVolDataOutput.playername = volDataRow.playerName;
arrVolDataOutput.parentname = volDataRow.parent1Name;
arrVolDataOutput.parentphone = volDataRow.parent1Phone;
arrVolDataOutput.parentemail = volDataRow.parent1Email;
for (var j = 0; j < arrparentjobs.length; ++j) {
  arrVolDataOutput.parentjob = arrparentjobs[j];
  dataRowsOutput.push(arrVolDataOutput);
  continue;
}
4

1 に答える 1

6

結果の行にはすべてまったく同じデータが含まれます

はい、それらはそうです。なぜならpush、深いコピーでも浅いコピーでもない参照を配列にparentjobプッシュし、まったく同じarrVolDataOutputオブジェクトを配列に何度もプッシュしながら単に を変更しているためです。

次のように、反復ごとに新しいオブジェクトを作成する必要があります。

var dataRowsOutput = [];
for (var j = 0; j < arrparentjobs.length; ++j) {
  dataRowsOutput.push({
    parentjob:   arrparentjobs[j],
    playerid:    volDataRow.playerId,
    timestamp:   volDataRow.timestamp,
    playername:  volDataRow.playerName,
    parentname:  volDataRow.parent1Name,
    parentphone: volDataRow.parent1Phone,
    parentemail: volDataRow.parent1Email
  });
}

他のフィールドがある場合arrVolDataOutputは、それらもオブジェクト リテラルに含める必要があります。

于 2013-01-31T08:46:29.957 に答える