2016-11-03 2 views
0

레코드에는 이전 색상/번호와 새 속성이 있으며 변경할 수 있습니다. 배열을 통해 반복하고 이전 값과 새 값이 일치하지 않는지 확인하려고합니다. 그렇지 않은 경우 어떤 속성이 변경되었는지 (색상/숫자) 결정하고 해당 레코드의 변경된 속성을 설정 한 다음 배열로 푸시하고 싶습니다. 레코드의 색과 숫자가 모두 변경된 경우에는 변경된 속성이 다른 각 배열 항목의 복사본이 필요합니다.어레이 푸시 덮어 쓰기

나는 여러 가지 방법을 시도해 왔으며, 내가 무엇을하더라도 변경된 속성을 덮어 쓰려고합니다. 로컬 배열을 사용하려고 시도 했는데도 문제가 해결되지 않았습니다. 다음은 그 예입니다. 당신이 output.push('rec')을 수행 할 때

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사본을 배치하지 않는다; 배열에 rec (또는보다 정확하게는 rec에 대한 참조)을 배치합니다.

그래서 경우에 두 속성이 변경된 경우, 당신은, "색상", 다음 배열에 rec에 대한 참조를 넣어 rec.changed 설정 "수"다음 배열에 rec 또 다른 참조를 넣어 rec.changed을 설정합니다. 모든 것이 단일 객체 인스턴스에 대해 수행됩니다. 당신이해야 할 무엇을 의미

이 두 객체, 각이 있었다 같은 id, oldColor, newColor, oldNumbernewNumber; 다른 값은 changed입니다. (이것이 가장 효율적인 접근 방법이 논쟁의 여지가 있는지 여부는 원하는 결과로 묘사 된 것입니다.)이를 위해서는 rec 사본을 만들어야합니다.

한 가지 방법은이 (사용 바닐라 자바 ​​스크립트를)해야 할 일 :

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

당신은 (대신 push(rec)push(copy)을 다음)를 누를 때마다 전에이 작업을 수행 할 수있다; 또는 너무 많은 불필요한 사본을 생성하는 경우 두 개의 인스턴스가 필요할 때 특별히 볼 수 있고 사본 만 만들 수 있습니다.

+0

감사 마크. 당신이 언급 한보다 효율적인 방법은 무엇입니까? – meli02

+0

글쎄요, 추측 컨데 ... 일단 당신이 그것을 만들었다면 당신이 배열을 가지고 무엇을하고 있는지에 달려 있습니다. 특정 방식으로 데이터를 표시해야하는 UI 그리드 용 데이터 저장소를 제공하는 경우 다른 방법이 없을 수 있습니다. OTOH 당신이 제어하는 ​​함수에 처리를 위해 이것을 전달한다면, 당신이 원하는 방식으로 구조를 정의 할 수 있습니다. 예를 들어'changed = 'both'; 'changed : [ "color", "number"]')는 (객체를 복사하기위한) 처리와 사본을 저장하기위한 메모리를 절약 할 수 있습니다. –