Cách copy mảng không làm thay đổi mảng ban đầu (14 cách)

Giới thiệu


Hi xin chào các bạn, ở chuỗi bài viết trước mình đã giới thiệu các method được sử dụng phổ biến nhất khi làm việc với Array trong JavaScript. Hôm nay chúng ta sẽ đến một bài viết khá hay ho nữa đó là: Làm thế nào để copy 'an toàn' một Array trong JS, 'an toàn' ở đây tức là ta phải đảm bảo việc copy không làm ảnh hưởng đến array gốc.


1. Sử dụng Array.slice()


Việc không truyền đối số vào slice() giúp ta tạo ra 1 bản sao từ array gốc


const numbers = [1, 2, 3, 4, 5];
const copy = numbers.slice();

console.log(copy);  // > Array [1, 2, 3, 4, 5]
console.log(numbers); // > Array [1, 2, 3, 4, 5]


2. Sử dụng Array.map()


Nếu bên trong thân hàm map() ta không biến đổi gì mà chỉ return item thì đồng nghĩa với việc ta đang copy array


const numbers = [1, 2, 3, 4, 5];

// ES5
const copy = numbers.map(function(number) {
 return number;
});

// ES6
// const copy = numbers.map(number => number);

console.log(copy);  // > Array [1, 2, 3, 4, 5]
console.log(numbers); // > Array [1, 2, 3, 4, 5]


3. Sử dụng Array.from()


Set trong JS là tập hợp các giá trị không bị trùng lặp, nghĩa là trong một set không thể có hai giá trị bằng nhau. Việc ta tạo ra 1 đối tượng Set chứa array và đặt vào trong Array.from() sẽ giúp ta copy được array


const numbers = [1, 2, 3, 4, 5];
const copy = Array.from(new Set(numbers));

console.log(copy);  // > Array [1, 2, 3, 4, 5]
console.log(numbers); // > Array [1, 2, 3, 4, 5]


4. Sử dụng spread operator


Từ khoá này quá quen thuộc với các devjs rồi, thường khi đã làm việc với ES6 thì dấu 3 chấm này được dùng rất phổ biến để copy array/object


const numbers = [1, 2, 3, 4, 5];
const copy = [...numbers];

console.log(copy);  // > Array [1, 2, 3, 4, 5]
console.log(numbers); // > Array [1, 2, 3, 4, 5]


5. Sử dụng Array.of() kết hợp spread operator


Array.of() được dùng để tạo ra một mảng mới với các phần tử được truyền vào thông qua tham số truyền vào


const numbers = [1, 2, 3, 4, 5];
const copy = Array.of(...numbers);

console.log(copy);  // > Array [1, 2, 3, 4, 5]
console.log(numbers); // > Array [1, 2, 3, 4, 5]


6. Sử dụng Array.push() kết hợp spread operator


Trước tiên ta khởi tạo 1 array rỗng, sau đó push nguyên array ban đầu vào ta sẽ thu được 1 bản sao


const numbers = [1, 2, 3, 4, 5];
let copy = [];
copy.push(...numbers);

console.log(copy);  // > Array [1, 2, 3, 4, 5]
console.log(numbers); // > Array [1, 2, 3, 4, 5]


7. Sử dụng Array.unshift() kết hợp spread operator


Có push() thì đương nhiên sẽ có unshift()

const numbers = [1, 2, 3, 4, 5];
let copy = [];
copy.unshift(...numbers);

console.log(copy);  // > Array [1, 2, 3, 4, 5]
console.log(numbers); // > Array [1, 2, 3, 4, 5]


8. Sử dụng array constructor kết hợp spread operator


Con hàng ... này đúng là lợi hại, chỗ nào cũng thấy mặt 😅


const numbers = [1, 2, 3, 4, 5];
const copy = new Array(...numbers);

console.log(copy);  // > Array [1, 2, 3, 4, 5]
console.log(numbers); // > Array [1, 2, 3, 4, 5]


9. Sử dụng destructuring


Ngoài spread operator thì trong ES6 cũng giới thiệu thêm destructuring, sử dụng nó để copy array như sau


const numbers = [1, 2, 3, 4, 5];
const [...copy] = numbers;

console.log(copy);  // > Array [1, 2, 3, 4, 5]
console.log(numbers); // > Array [1, 2, 3, 4, 5]


10. Sử dụng Array.concat()


Cũng giống như slice() việc bạn không truyền đối số vào concat() sẽ giúp trả về array mới chính là array ban đầu


const numbers = [1, 2, 3, 4, 5];
const copy = numbers.concat();

console.log(copy);  // > Array [1, 2, 3, 4, 5]
console.log(numbers); // > Array [1, 2, 3, 4, 5]


11. Sử dụng Array.forEach() kết hợp Array.push()


const numbers = [1, 2, 3, 4, 5];
let copy = [];

// ES5
numbers.forEach(function(value) {
 copy.push(value);
});

// ES6
// numbers.forEach(value => copy.push(value));

console.log(copy);  // > Array [1, 2, 3, 4, 5]
console.log(numbers); // > Array [1, 2, 3, 4, 5]


12. Sử dụng vòng lặp for truyền thống


const numbers = [1, 2, 3, 4, 5];
let copy = [];
for (let i = 0; i < numbers.length; i++) {
 copy.push(numbers[i]);
}

console.log(copy);  // > Array [1, 2, 3, 4, 5]
console.log(numbers); // > Array [1, 2, 3, 4, 5]


13. Sử dụng Array.reduce()


Tạo một biến tích luỹ là 1 array rỗng sau đó push dần các phần tử vào sẽ giúp ta copy được array


const numbers = [1, 2, 3, 4, 5];
const copy = numbers.reduce((arr, item) => {
 arr.push(item);
 return arr;
}, []);

console.log(copy);  // > Array [1, 2, 3, 4, 5]
console.log(numbers); // > Array [1, 2, 3, 4, 5]


14. Sử dụng phương thức apply


const numbers = [1, 2, 3, 4, 5];
let copy = [];
Array.prototype.push.apply(copy, numbers);

console.log(copy);  // > Array [1, 2, 3, 4, 5]
console.log(numbers); // > Array [1, 2, 3, 4, 5] 


Tổng kết


Đây là 14 cách để copy mảng mà không ảnh hưởng mảng bạn đầu, dù cách nào đi nữa cũng hiểu rõ bản chất của mảng để sáng tạo thêm nhé. Hy vọng bài viết này sẽ hữu ích cho cách bạn!

quản trị viên

Chia sẻ bài viết:

Tin tức liên quan

Gửi mail trong nodejs với Nodemailer đơn giản trong lập trình Javascript

Gửi mail trong nodejs với Nodemailer đơn giản trong lập trình Javascript

Trong bài viết này mình hướng dẫn chi tiết gửi mail thông qua Nodemailer đơn giản nhất, việc gửi email không chỉ đơn giản là gửi văn bản thông điệp nữa. Email đã trở thành một phần quan trọng của ứng dụng và dịch vụ trực tuyến, từ việc xác nhận tài khoản, thông báo sự kiện cho đến marketing. Trong bài viết này, chúng ta sẽ khám phá cách sử dụng thư viện Nodemailer trong Node.js để dễ dàng gửi email từ ứng dụng của bạn.

Cách sử dụng Async Await Fetch Axios trong lập trình JavaScript

Cách sử dụng Async Await Fetch Axios trong lập trình JavaScript

Trong lập trình JavaScript, async/await và fetch/axios là những khái niệm quan trọng giúp xử lý các tác vụ bất đồng bộ một cách dễ dàng và hiệu quả. Trên thực tế, chúng đã trở thành tiêu chuẩn cho việc làm việc với API và tương tác với dữ liệu từ máy chủ. Trong bài viết này, chúng ta sẽ khám phá sâu hơn về async/await, fetch, axios và cách chúng hoạt động trong lập trình JavaScript.

Xem thêm...