2016-11-03 23 views
0

レコードには古い色/番号と新しいプロパティがあり、これは変更できます。私は配列をループし、古い値と新しい値が一致しないかどうかを確認したい。もしそうでなければ、どのプロパティが変更されたのか(カラー/数値)を決定し、そのレコードの変更されたプロパティを設定し、それを配列にプッシュしたいと思います。レコードに色と数値の両方が変更されている場合は、変更されたプロパティが異なる各配列エントリのコピーが必要です。アレイプッシュ上書き

私はいくつかの方法を試しましたが、プッシュは私が何をしても変更されたプロパティを上書きしています。私はローカル配列を使用しようとしましたが、どちらもうまくいきませんでした。ここに例があります。

export class Record { 
id: string; 
oldcolor: string; 
newcolor: string; 
oldnumber: string; 
newnumber: string; 
changed: string; 
} 




@Input() newrecords: Record[]; 
output: Record[] = []; 

functionTest() { 

    for (let rec of this.newrecords) { 


      if (rec.newcolor != rec.oldcolor) { 

       rec.changed = "color"; 
       output.push(rec); 


     } 

      if (rec.newnumber != rec.oldnumber) { 

       rec.changed = "number"; 
       output.push(rec); 

      } 


     } 
    } 


desired result 
[{ 
id: 1; 
oldcolor: red; 
newcolor: red; 
oldnumber: 6; 
newnumber: 6; 
changed: color; 
}, 
{ 
id: 1; 
oldcolor: red; 
newcolor: red; 
oldnumber: 6; 
newnumber: 6; 
changed: number; 
}] 

答えて

1

あなたはそれが配列でrecコピーを配置しないoutput.push('rec')を行います。配列にrec(または、より正確にはrecへの参照)を配置します。

だから、両方のプロパティが変更されている、あなたは「色」にrec.changedを設定する場合には、その配列にrecに別の参照を入れて、「番号」にrec.changedを設定し、その後、配列にrecへの参照を置きます。すべてが単一のオブジェクトインスタンスに対して行われています。あなたがする何を意味するのか

は、2つのオブジェクト、同じidとそれぞれ、oldColornewColoroldNumber、およびnewNumberを持っていました。異なる値のchanged値を使用します。 (最も効率的なアプローチが議論の余地があるかもしれませんが、それはあなたが望む結果として記述したものです)。ある時点で、recのコピーを作成する必要があります。これを行うには

一つの方法(バニラはJavaScriptを使用して):

var copy = { 
    id: rec.id, 
    oldColor: rec.oldColor, 
    newColor: rec.newColor, 
    oldNumber: rec.oldNumber, 
    newNumber: rec.newNumber, 
    changed: rec.changed 
} 

をあなたはすべてのプッシュの前にこれを行う(そして代わりにpush(rec)push(copy))ことができ;それが必要以上に多くのコピーを作成した場合は、2つのインスタンスが必要なときに特別に参照してコピーを作成することができます。

+0

ありがとうございました。あなたが言及したより効率的な方法のいくつかは何ですか? – meli02

+0

まあ、私が推測しているのは、あなたがそれを作った後は、あなたが配列を使って何をしているかによって変わります。データを特定の方法で表示する必要があるUIグリッドのデータストアに、たとえば別の方法がない場合、あなたが制御する関数にこれを渡して、あなたが好きなように構造体を定義できたら、例えば 'changed = 'both''の値を持つことができます。 'changed:[" color "、" number "]')は、処理(オブジェクトのコピー)とメモリ(コピーの保存)を節約することができます。 –