js(八) 轉殖與陣列去重

2021-08-14 03:08:51 字數 2345 閱讀 1210

轉殖

轉殖和我們前面所講的繼承有一些區別,轉殖是複製出來乙個一模一樣的目標物件,而轉殖又分為淺層轉殖和深層轉殖,本質就是把乙個物件的一些屬性複製成完全一樣的另乙個物件。

淺度轉殖

淺度轉殖是認為物件的的屬性,沒有物件和陣列,直接把物件的一些屬性給複製過來。

function

clone

(p,c);//當沒有傳值是,預設為乙個物件。

for(var prop in p)

}}var obj1 =

var obj2 = {};

clone(obj1,obj2)

obj1.arr.push(5)

obj1.name = "yun";

console.log(obj2);

列印的結果如下:

我們可以發現,轉殖出來的目標物件和本來的源物件之間沒有關係了。

但是,當我們有乙個屬性是引用值(陣列或者物件)的時候,按照我們這種轉殖方式,只是把這個引用值的指向賦給了新的目標物件,也就是說,我們一旦改變了源物件或者目標物件的引用值屬性,另乙個也會跟著改變,這一點就是淺層轉殖的缺點。

淺度轉殖

為了解決淺層轉殖的引用值的問題,我們又需要一種深層轉殖。

其實深層轉殖的原理也很簡單,我們只要不轉殖引用值的引用,而是吧引用值也當做乙個源物件,把裡面的值乙個乙個的轉殖進目標物件裡面,不就解決了他們二者相同指向的問題了嗎。

陣列去重

這個去重的思路是,現將陣列進行排序(sort()),排完之後,前後指定有一樣的。然後在拿乙個陣列儲存第乙個數,然後在把後面的與它前乙個數比較,如果是不相同的,那麼進把它儲存在陣列裡面,最後迴圈結束之後。再將其返回出來,這個方法最好寫在陣列的原型鏈上。

array.prototype.unique = function()}

console.timeend('第一種時間');

return arr

}

這種方式雖然比較快,但是它是優缺點的,這個方法改變原陣列的位置。如果題目要求不讓改變陣列的原位置,這種方式就不好使。

這裡特說明一下吧,sort()這種排序的方式,不是按照大小的方式,它是按照二進位製碼進行排序的。

var arr1 = [10,2,2,2,4,9,5,3,9,4,3,7,5];

console.log(arr1.sort());//10,2, 2, 2, 3, 3, 4, 4, 5, 5, 7, 9, 9,

想要進行排序也是行的:

arr1.sort(function

(a,b))

array.prototype.unique = function

()if(!flag)}}

console.timeend('第二種時間');

return arr;

}

這種方式相對來說是比較慢的,它是經歷了兩個迴圈的,用專業術語來講,它的時間複雜度是(n^2)。這也是很常規的方式,缺點就是迴圈相對來說比較慢。但是跟第一種方式來比較的話,他不會改變原陣列的位置。

array.prototype.unique = function

(); console.time('第三種時間');

for(var i = 0;i < this.length; i++)

}console.timeend('第三種時間');

return arr;

}

最後說一種方法,es6中的一種去重的方法:

var arr = new

set(arr1);

這種方法可以直接呼叫。

es6 轉殖與函式深度轉殖

es6的.運算,可以進行一層的深度轉殖 在多層的情況下,不要用這種啊.用深度轉殖函式,或者json.parse json.stringify obj 但json方式要求不能有屬性值是函式的物件 1 const obj 6 7 const obj3 8 obj3.name obj.name 這個效果和...