код в методе подписки не выполняется в правильном порядке - PullRequest
0 голосов
/ 23 апреля 2019

Из запроса get я получаю массив объектов и хочу назначить эти данные двум различным переменным. Одна переменная получит все данные, вторая переменная получит измененную версию этих данных.

Код, который я пробовал:

this.service.getEmployeeTimesheets().subscribe(res => {

     this.timesheets = res; 
     this.mutatedTimesheets = res.map(j => {

       delete j["keyName1"];
       delete j["keyName2"]; 

     });
 console.log(this.mutatedTimesheets);

   });

Что происходит, так это то, что по каким-то причинам значение таймшетов изменяется, а mutatedTimesheets получает массив неопределенных

Ответы [ 3 ]

0 голосов
/ 23 апреля 2019

это не работает так, когда функция карты возвращает новый массив, она возвращает новый массив, но ссылки на объекты совпадают, например, если у есть

    var user = {firstname:"user1",password:"pass123"};

    var first = [user];

    var second =[user];

    delete user["firstname"];

    console.log(first) // [{password:"pass123"}]
    console.log(second) // [{password:"pass123"}]

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

this.mutatedTimesheets = res.map(j => {
    let newObjectReference ={...j};
    delete newObjectReference["keyName1"];
    delete newObjectReference["keyName2"]; 
    return newObjectReference;

});
0 голосов
/ 23 апреля 2019

Вы делаете 2 ошибки .

1) Копирование массива по ссылке . Таким образом, табели также изменяются

2) Не возвращает измененный элемент с карты


Попробуйте это

this.service.getEmployeeTimesheets().subscribe(res => {

     this.timesheets = res; 
     this.mutatedTimesheets = res.map(j => {

       // Re-reference the current object
       j = {...j};

       delete j["keyName1"];
       delete j["keyName2"]; 

       return j;

     });

     console.log(this.mutatedTimesheets);

   });
0 голосов
/ 23 апреля 2019

РЕДАКТИРОВАТЬ : Чтобы сделать несколько копий одного и того же объекта без изменения друг друга, вы можете использовать var obj = JSON.parse(JSON.stringify(res)).

Итак, в вашем случае: this.timesheets = JSON.parse(JSON.stringify(res));

Более подробное объяснение того, как клонирование объектов ведет себя в javascript (например, Как правильно клонировать объект JavaScript? ) но здесь работает цепочка функций JSON


В вашем res.map() вы забыли вернуть j:

this.mutatedTimesheets = res.map(j => {

    delete j["keyName1"];
    delete j["keyName2"]; 
    return j;

});

Должен сделать трюк

...