您好,登錄后才能下訂單哦!
這篇“js中怎么復制一個數組”文章的知識點大部分人都不太理解,所以小編給大家總結了以下內容,內容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“js中怎么復制一個數組”文章吧。
在js中,我們經常會用到數組復制,Array是引用類型,如果用arrA=arrB簡單的把一個數組賦值,并沒有創造出一個新數組,arrA和arrB其實指向的還是同一個地址,改變一個另一個也會隨之改變,很明顯這并不是我們想要的
var arr = [1, 2, 3]; var newArr = arr; arr.push(4); console.log(newArr1); // [1, 2, 3, 4]
(適用于數組并不復雜,即數組中沒有嵌套對象或者嵌套數組)
concat()方法用于連接兩個或多個數組;
concat() 方法不會更改現有數組,而是返回一個新數組,其中包含已連接數組的值。
var arr = [1, 2, 3]; var newArr = arr.concat(); arr.push(4); console.log(newArr); // [1, 2, 3]
slice() 方法以新的數組對象,返回數組中被選中的元素;
slice() 方法選擇從給定的 start 參數開始的元素,并在給定的 end 參數處結束,但不包括;
slice() 方法不會改變原始數組;
var arr = [1, 2, 3]; var newArr = arr.slice(); arr[0] = 10; console.log(arr);// [10, 2, 3] console.log(newArr);// [1, 2, 3]
var arr = [1, 2, 3]; var [ ...newArr ] = arr; arr[0] = 10; console.log(arr); // [10, 2, 3] console.log(newArr);// [1, 2, 3]
var arr = [1, 2, 3]; var newArr = Object.assign([], arr); arr[0] = 10; console.log(arr);// [10, 2, 3] console.log(newArr);// [1, 2, 3]
如果數組元素是對象或者數組,上面四種方法就會只拷貝數組或者對象的引用,如果我們對其中一個數組進行修改,另一個數組也會發生變化
比如:
var arr = [ { a: 1 }, [ 1, 2 ], 3 ]; let newArr = arr.concat(); arr[0].a = 2; console.log(arr); // [ { a: 2 }, [ 1, 2 ], 3 ] console.log(newArr);// [ { a: 2 }, [ 1, 2 ], 3 ] 值被影響
(可以完全拷貝一個數組,即使嵌套了對象或者數組,兩者也不會互相影響)
var arr = [ { a: 1 }, [ 1, 2 ], 3 ]; // let newArr = JSON.parse(JSON.stringify(arr)); let newArr = arr.concat(); arr[0].a = 2; console.log(arr); // [ { a: 2 }, [ 1, 2 ], 3 ] console.log(newArr);// [ { a: 1 }, [ 1, 2 ], 3 ]
但是該方法是有局限性的
會忽略 undefined
會忽略 symbol
不能序列化函數
不能解決循環引用的對象
比如下面這個例子:
let a = { age: undefined, sex: Symbol('male'), jobs: function() {}, name: 'sun' } let b = JSON.parse(JSON.stringify(a)) console.log(b) // {name: "sun"}
拷貝的時候判斷屬性值的類型,如果是對象,繼續遞歸調用深拷貝函數(簡易版)
var deepCopy = function(obj) { // 判斷是否是對象 if (typeof obj !== 'object') return; // 判斷obj類型,根據類型新建一個對象或者數組 var newObj = obj instanceof Array ? [] : {} // 遍歷對象,進行賦值 for (var key in obj) { if (obj.hasOwnProperty(key)) { let val = obj[key]; // 判斷屬性值的類型,如果是對象,遞歸調用deepCopy newObj[key] = typeof val === 'object' ? deepCopy(val) : val } } return newObj }
_.cloneDeep(value)
其中value就是要深拷貝的值
簡單例子
var objects = [{ 'a': 1 }, { 'b': 2 }]; var deep = _.cloneDeep(objects); console.log(deep[0] === objects[0]); // => false
npm i --save lodash
import _ from 'lodash'; Vue.prototype._ = _;
let newObj = this._.cloneDeep(oldObj)
以上就是關于“js中怎么復制一個數組”這篇文章的內容,相信大家都有了一定的了解,希望小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。