Sự khác biệt giữa map và forEach bao gồm tốc độ và khi nào sử dụng trong javascript

Nội dung bài viết

Sự khác biệt giữa map và forEach bao gồm tốc độ và khi nào sử dụng trong javascript map và forEach là một trong số hàm phổ biến và được sử dụng nhiều nhất trong JavaScript kể từ khi ES6 ra đời. Trong bài viết này, chúng ta sẽ thảo luận về sự khác biệt chính giữa chúng và lần lượt đi qua một số ví dụ về cách sử dụng map và forEach.


Trước khi đọc


Về cơ bản thì lặp qua một array hay một objects thì đa số chúng ta đã được nghiên cứu qua những bài viết trước đây. Theo mặc định, một Array có thể lặp lại. Và mapforEach cũng được dùng để lặp qua một array nhưng ở đây chúng ta cần biết khi nào sử dụng map() và khi nào sử dụng forEach? Giữa mapforEach khác nhau những gì? Nếu bạn muốn tìm hiểu thêm, tôi khuyên bạn nên xem các đối tượng có thể lặp lại trong JavaScript là gì! "Sự khác biệt giữa for...in, for...of and forEach trong javascript" 


map và forEach là gì?


Có lẽ không cần nói nhiều nhưng cũng nên nói một chút về khái niệm mapforEach là gì? mapforEach là một phương thức trợ giúp trong mảng, bạn có thể dễ dàng lặp qua những items trong một array. Ngày xưa thì chúng ta những devjs đời đầu thì sử dụng for để làm điều này

 var array = ['1', '2', '3'];
for (var i = 0; i < array.length; i += 1) {
  console.log(Number(array[i]));
}
// 1
// 2
// 3

Đây là cách cổ điển và phổb biến vào thời đó để lặp lại một mảng. Bắt đầu với ECMAScript 5, các tính năng mới dường như khiến các lập trình viên javascript hạnh phúc hơn, vì có thể sử dụng chúng để hỗ trợ được nhiều hơn.


Cú pháp của map trong javascript


Chúng ta lần lượt nói nhanh về cú pháp của map

const arr = ['1', '2', '3'];

// Hàm gọi lại chấp nhận 3 tham số
// Giá trị hiện tại của mảng làm tham số đầu tiên
// Vị trí của giá trị hiện tại trong mảng được sử dụng làm tham số thứ hai
// Mảng nguồn ban đầu làm tham số thứ ba

const cb = (str, i, origin) => {
  console.log(`${i}: ${Number(str)} / ${origin}`);
};
arr.map(cb);
// 0: 1 / 1,2,3
// 1: 2 / 1,2,3
// 2: 3 / 1,2,3

Và cuối cùng khi sử dụng map thì kết quả của không bằng mảng ban đầu. Ví dụ:

const arr = [1];
const new_arr = arr.map(d => d);

arr === new_arr; // false

Chú ý khi sử dụng map với function arrow. Trước đây chúng ta đã đề cập rõ hơn về điều này. Theo tôi các bạn nên đọc qua, đó cũng là một trong những sai lầm khi sử dụng map và arrow function. Sự khác nhau giữa Regular và Arrow Functions trong JavaScript

Đây là một ví dụ minh hoạ

const obj = { name: 'Anonystick.com' };

[1].map(function() {
  // { name: 'Anonystick.com' }
  console.dir(this);
}, obj);

[1].map(() => {
  // window
  console.dir(this);
}, obj);

Cú pháp của forEachtrong javascript


Chúng ta xem qua một ví dụ để xem xét giữa forEachmap khác nhau những gì?

const arr = ['1', '2', '3'];
// Hàm gọi lại chấp nhận 3 tham số
// Giá trị hiện tại của mảng làm tham số đầu tiên
// Vị trí của giá trị hiện tại trong mảng được sử dụng làm tham số thứ hai
// Mảng nguồn ban đầu làm tham số thứ ba
const cb = (str, i, origin) => {
  console.log(`${i}: ${Number(str)} / ${origin}`);
};
arr.forEach(cb);
// 0: 1 / 1,2,3
// 1: 2 / 1,2,3
// 2: 3 / 1,2,3

Có gì khác biệt? Sử dụng map sẽ nhận được một mảng mới so với mảng ban đầu. forEach thì không trong trường hợp này.

[1,2,3].map(d => d + 1); // [2, 3, 4];
[1,2,3].forEach(d => d + 1); // undefined;

Khi nào sử dụng map và forEach?


Đây là một câu hỏi rất hay và được nhiều dev quan tâm. Và đa số những bạn học reactjs sẽ hiểu vấn đề này hơn. Điều khác biệt chủ yếu giữa mapforEach đó chính là có giá trị trả về hay không? Chính vì vậy nếu bạn muốn return về một giá trị mới thì hãy sử dụng map, ngược lại nếu bạn muốn ánh xạ tới những gía trị của những item trong một array thì nên dùng forEach

Đây là một ví dụ đơn giản. 

const people = [
  { name: 'anonystick.com', whatCanDo: 'javascript' },
  { name: 'medium.com', whatCanDo: 'security' },
  { name: 'drsku.com', whatCanDo: 'php' }
];

function makeWorkers(people) {
  return people.map((person) => {
    const { name, whatCanDo } = person;
    return 
  • My name is {name}, I can do {whatCanDo}
}); }

Ví dụ khi làm ở react thì map sẽ hiệu quả hơn hẳn.

const mySubjectId = ['154', '773', '245'];

function countSubjects(subjects) {
  let cnt = 0;
  
  subjects.forEach(subject => {
    if (mySubjectId.includes(subject.id)) {
      cnt += 1;
    }
  });
  
  return cnt;
}

countSubjects([
  { id: '223', teacher: 'Mark' },
  { id: '154', teacher: 'Linda' }
]);
// 1

Tóm lại, tôi khuyên bạn nên sử dụng map khi tạo một mảng mới và sử dụng forEach khi bạn không cần tạo một mảng mới, nhưng hãy làm điều gì đó với dữ liệu phù hợp và cụ thể của mỗi dự án.


So sánh tốc độ map và forEach

map vs foreach in javascript

Một số bài viết đề cập nhanh map hơn forEach. Vì vậy, tôi tò mò nếu điều này là sự thật. Tôi tìm thấy kết quả so sánh này. Đoạn code trông rất giống nhau, nhưng kết quả thì ngược lại. Một số nói rằng bài kiểm tra cho forEach nhanh hơn, một số nói rằng map nhanh hơn. Có thể bạn nói với chính mình map hay forEach nhanh hơn tuỳ thuộc vào bạn code thế nào, bạn có thể đúng. Thành thật mà nói, tôi không chắc.

Ref: medium.com

Có thể bạn đã bị missing