2016-11-03 4 views
0

Запись имеет старый цвет/число и новые свойства, которые можно изменить. Я хочу перебрать массив и проверить, не совпадают ли старые и новые значения. Если они этого не сделают, я бы хотел определить, какое свойство было изменено (цвет/число), установить свойство измененной записи и нажать на массив. Если запись имеет изменения как для цвета, так и для номера, мне нужна копия каждой записи массива с другим измененным свойством.Array Push Overwrite

Я пробовал несколько разных способов, и нажатие перезаписывает измененное свойство, независимо от того, что я делаю. Я попытался использовать локальный массив, и это тоже не сработало. Вот пример.

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

Когда вы output.push('rec') не размещать копиюrec в массиве; он помещает rec (или, точнее, ссылку на rec) в массив.

Таким образом, в случае, когда оба свойства изменились, вы установите rec.changed в «цвет», а затем поставить ссылку на rec в массиве, а затем установите rec.changed на «номер», а затем поставить другую ссылку на rec в массиве. Все делается для одного экземпляра объекта.

Что ты хотел сделать, есть два объекта, каждый с тем же id, oldColor, newColor, oldNumber и 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(copy) вместо push(rec)); или если это создает слишком много ненужных копий, которые вы могли бы увидеть, когда вам нужно два экземпляра и сделать копию только тогда.

+0

Спасибо, Марк, что сработало. Какие из наиболее эффективных способов вы упомянули? – meli02

+0

Ну, на самом деле просто размышлять, я думаю ... это зависит от того, что вы делаете с массивом, как только вы его создали. Если вы кормите, скажем, хранилище данных для сетки пользовательского интерфейса, которое должно показывать данные определенным образом, тогда другого способа не может быть. OTOH, если вы передаете это для обработки в функцию, которую вы контролируете, и поэтому можете определить структуру любым способом, например, имея значение для 'changed = 'both''; или позволяя значение 'changed' быть массивом (' changed: ["color", "number"] ') может сохранять обработку (для копирования объектов) и памяти (для хранения копий). –