2017-09-01 9 views
0

プライベートアレイを持つクラスがあります。可変スライスアレイに割り当てることで元の配列を変更することができます

class BookService{ 
    private booksList: Book[]; 

    constructor(){ 
     this.booksList = [ 
     new Book('Tales', true), 
     new Book('Novels', false), 
     new Book('Dictionary', false) 
     ]; 
    } 

    getBooks(){ 
     return this.booksList; 
    } 

} 

class Book{ 
    constructor (public name: string, public isRead: boolean){} 
} 

export const bookService = new BookService(); 

また、実装があります。

元配列のコピーを取得しました。次に、ローカル配列(元の配列のコピー)を変更しました。修正された原点配列を取得しました。

なぜ私設配列が変更されたのか理解できませんか?

私は

getBooks(){ 
    return this.booksList.slice(0); 
    } 

にはgetBooksを変更する場合、それは助けにはなりません。

Iは、元の配列が変更されない_.cloneDeep Method description

getBooks(){ 
    return _.cloneDeep(this.booksList); 
    } 

lodash法を用いてはgetBooksを変更する場合。 なぜですか?このような状況に関連する間違いを避けるには?

+0

JavaScriptオブジェクトを正しくクローンするにはどうすればいいですか?(https://stackoverflow.com/questions/728360/how-do-i-correctly-clone-a-javascript-object) – kGielo

+0

配列のコピーその中に含まれるオブジェクトのコピーを作成しません。 – deceze

+0

あなたがやっていることは_shallow copy_と呼ばれています。 – undefined

答えて

0

sliceで配列を複製すると、内部のオブジェクトは同じままです。あなたは3つのオブジェクト、配列arrabcを持っていて、それを複製した場合

、新しい配列がまだかなり同じように見える新しいオブジェクトよりabc、への参照が含まれています。

var arr = [ a, b, c ]; 
var arr2 = arr.slice(0); // [ a, b, c ]; 

arr === arr2; // false - they are not the same array 

arr[0] === arr2[0]; // true - they contain the same a object 

これは、あなたがarr2からaを得れば、それはarrにある同じaオブジェクトだということを意味します - ので1が両方を変更し修正します。

関連する問題