Chức năng bản đồ javascript

Phương thức

const numbers = [1, 4, 9];
const roots = numbers.map((num) => Math.sqrt(num));

// roots is now     [1, 2, 3]
// numbers is still [1, 4, 9]
2 tạo một mảng mới được điền với kết quả của việc gọi một hàm được cung cấp trên mọi phần tử trong mảng đang gọi

Show

    // Arrow function
    map((element) => { /* … */ })
    map((element, index) => { /* … */ })
    map((element, index, array) => { /* … */ })
    
    // Callback function
    map(callbackFn)
    map(callbackFn, thisArg)
    
    // Inline callback function
    map(function (element) { /* … */ })
    map(function (element, index) { /* … */ })
    map(function (element, index, array) { /* … */ })
    map(function (element, index, array) { /* … */ }, thisArg)
    

    const numbers = [1, 4, 9];
    const roots = numbers.map((num) => Math.sqrt(num));
    
    // roots is now     [1, 2, 3]
    // numbers is still [1, 4, 9]
    
    3

    Một hàm để thực thi cho từng phần tử trong mảng. Giá trị trả về của nó được thêm vào dưới dạng một phần tử trong mảng mới

    Hàm được gọi với các đối số sau

    const numbers = [1, 4, 9];
    const roots = numbers.map((num) => Math.sqrt(num));
    
    // roots is now     [1, 2, 3]
    // numbers is still [1, 4, 9]
    
    4

    Phần tử hiện tại đang được xử lý trong mảng

    const numbers = [1, 4, 9];
    const roots = numbers.map((num) => Math.sqrt(num));
    
    // roots is now     [1, 2, 3]
    // numbers is still [1, 4, 9]
    
    5

    Chỉ số của phần tử hiện tại đang được xử lý trong mảng

    const numbers = [1, 4, 9];
    const roots = numbers.map((num) => Math.sqrt(num));
    
    // roots is now     [1, 2, 3]
    // numbers is still [1, 4, 9]
    
    6

    Mảng

    const numbers = [1, 4, 9];
    const roots = numbers.map((num) => Math.sqrt(num));
    
    // roots is now     [1, 2, 3]
    // numbers is still [1, 4, 9]
    
    2 đã được gọi

    const numbers = [1, 4, 9];
    const roots = numbers.map((num) => Math.sqrt(num));
    
    // roots is now     [1, 2, 3]
    // numbers is still [1, 4, 9]
    
    8 Tùy chọn

    Một giá trị được sử dụng như là

    const numbers = [1, 4, 9];
    const roots = numbers.map((num) => Math.sqrt(num));
    
    // roots is now     [1, 2, 3]
    // numbers is still [1, 4, 9]
    
    9 khi thực thi
    const numbers = [1, 4, 9];
    const roots = numbers.map((num) => Math.sqrt(num));
    
    // roots is now     [1, 2, 3]
    // numbers is still [1, 4, 9]
    
    3. Thấy

    Một mảng mới với mỗi phần tử là kết quả của hàm gọi lại

    Phương pháp

    const numbers = [1, 4, 9];
    const roots = numbers.map((num) => Math.sqrt(num));
    
    // roots is now     [1, 2, 3]
    // numbers is still [1, 4, 9]
    
    2 là một. Nó gọi hàm
    const numbers = [1, 4, 9];
    const roots = numbers.map((num) => Math.sqrt(num));
    
    // roots is now     [1, 2, 3]
    // numbers is still [1, 4, 9]
    
    3 được cung cấp một lần cho mỗi phần tử trong một mảng và xây dựng một mảng mới từ kết quả

    const numbers = [1, 4, 9];
    const roots = numbers.map((num) => Math.sqrt(num));
    
    // roots is now     [1, 2, 3]
    // numbers is still [1, 4, 9]
    
    3 chỉ được gọi cho các chỉ mục mảng có giá trị được gán. Nó không được gọi cho các khe trống trong

    Phương pháp

    const numbers = [1, 4, 9];
    const roots = numbers.map((num) => Math.sqrt(num));
    
    // roots is now     [1, 2, 3]
    // numbers is still [1, 4, 9]
    
    2 là một. Nó không thay đổi
    const numbers = [1, 4, 9];
    const roots = numbers.map((num) => Math.sqrt(num));
    
    // roots is now     [1, 2, 3]
    // numbers is still [1, 4, 9]
    
    9. Tuy nhiên, hàm được cung cấp dưới dạng
    const numbers = [1, 4, 9];
    const roots = numbers.map((num) => Math.sqrt(num));
    
    // roots is now     [1, 2, 3]
    // numbers is still [1, 4, 9]
    
    3 có thể thay đổi mảng. Tuy nhiên, lưu ý rằng độ dài của mảng được lưu trước lần gọi đầu tiên của
    const numbers = [1, 4, 9];
    const roots = numbers.map((num) => Math.sqrt(num));
    
    // roots is now     [1, 2, 3]
    // numbers is still [1, 4, 9]
    
    3. Vì vậy

    • const numbers = [1, 4, 9];
      const roots = numbers.map((num) => Math.sqrt(num));
      
      // roots is now     [1, 2, 3]
      // numbers is still [1, 4, 9]
      
      3 sẽ không truy cập bất kỳ phần tử nào được thêm vào ngoài độ dài ban đầu của mảng khi lệnh gọi tới
      const numbers = [1, 4, 9];
      const roots = numbers.map((num) => Math.sqrt(num));
      
      // roots is now     [1, 2, 3]
      // numbers is still [1, 4, 9]
      
      2 bắt đầu
    • Các thay đổi đối với các chỉ mục đã truy cập không khiến ___________3 được gọi lại trên chúng
    • Nếu một phần tử hiện có, chưa được truy cập của mảng bị thay đổi bởi
      const numbers = [1, 4, 9];
      const roots = numbers.map((num) => Math.sqrt(num));
      
      // roots is now     [1, 2, 3]
      // numbers is still [1, 4, 9]
      
      3, thì giá trị của nó được truyền cho
      const numbers = [1, 4, 9];
      const roots = numbers.map((num) => Math.sqrt(num));
      
      // roots is now     [1, 2, 3]
      // numbers is still [1, 4, 9]
      
      3 sẽ là giá trị tại thời điểm phần tử đó được truy cập. Các phần tử đã xóa không được truy cập

    Cảnh báo. Các sửa đổi đồng thời thuộc loại được mô tả ở trên thường dẫn đến mã khó hiểu và thường nên tránh (trừ trường hợp đặc biệt)

    Phương pháp

    const numbers = [1, 4, 9];
    const roots = numbers.map((num) => Math.sqrt(num));
    
    // roots is now     [1, 2, 3]
    // numbers is still [1, 4, 9]
    
    2 là. Nó chỉ mong đợi giá trị
    const numbers = [1, 4, 9];
    const roots = numbers.map((num) => Math.sqrt(num));
    
    // roots is now     [1, 2, 3]
    // numbers is still [1, 4, 9]
    
    9 có thuộc tính
    const numbers = [1, 4, 9];
    const doubles = numbers.map((num) => num * 2);
    
    console.log(doubles); // [2, 8, 18]
    console.log(numbers); // [1, 4, 9]
    
    5 và các thuộc tính có khóa số nguyên

    const numbers = [1, 4, 9];
    const doubles = numbers.map((num) => num * 2);
    
    console.log(doubles); // [2, 8, 18]
    console.log(numbers); // [1, 4, 9]
    
    6 xây dựng một mảng mới, gọi nó mà không sử dụng mảng được trả về là một phản mẫu;

    Đoạn mã sau lấy một mảng các số và tạo một mảng mới chứa căn bậc hai của các số trong mảng đầu tiên

    const numbers = [1, 4, 9];
    const roots = numbers.map((num) => Math.sqrt(num));
    
    // roots is now     [1, 2, 3]
    // numbers is still [1, 4, 9]
    

    Đoạn mã sau lấy một mảng các đối tượng và tạo một mảng mới chứa các đối tượng mới được định dạng lại

    const kvArray = [
      { key: 1, value: 10 },
      { key: 2, value: 20 },
      { key: 3, value: 30 },
    ];
    
    const reformattedArray = kvArray.map(({ key, value }) => ({ [key]: value }));
    
    console.log(reformattedArray); // [{ 1: 10 }, { 2: 20 }, { 3: 30 }]
    console.log(kvArray);
    // [
    //   { key: 1, value: 10 },
    //   { key: 2, value: 20 },
    //   { key: 3, value: 30 }
    // ]
    

    Đoạn mã sau cho biết cách hoạt động của

    const numbers = [1, 4, 9];
    const doubles = numbers.map((num) => num * 2);
    
    console.log(doubles); // [2, 8, 18]
    console.log(numbers); // [1, 4, 9]
    
    6 khi một hàm yêu cầu một đối số được sử dụng với nó. Đối số sẽ tự động được gán từ mỗi phần tử của mảng dưới dạng các vòng lặp
    const numbers = [1, 4, 9];
    const doubles = numbers.map((num) => num * 2);
    
    console.log(doubles); // [2, 8, 18]
    console.log(numbers); // [1, 4, 9]
    
    6 xuyên qua mảng ban đầu

    const numbers = [1, 4, 9];
    const doubles = numbers.map((num) => num * 2);
    
    console.log(doubles); // [2, 8, 18]
    console.log(numbers); // [1, 4, 9]
    

    Phương thức

    const numbers = [1, 4, 9];
    const roots = numbers.map((num) => Math.sqrt(num));
    
    // roots is now     [1, 2, 3]
    // numbers is still [1, 4, 9]
    
    2 đọc thuộc tính
    const numbers = [1, 4, 9];
    const doubles = numbers.map((num) => num * 2);
    
    console.log(doubles); // [2, 8, 18]
    console.log(numbers); // [1, 4, 9]
    
    5 của
    const numbers = [1, 4, 9];
    const roots = numbers.map((num) => Math.sqrt(num));
    
    // roots is now     [1, 2, 3]
    // numbers is still [1, 4, 9]
    
    9 và sau đó truy cập từng chỉ mục số nguyên

    const arrayLike = {
      length: 3,
      0: 2,
      1: 3,
      2: 4,
    };
    console.log(Array.prototype.map.call(arrayLike, (x) => x ** 2));
    // [ 4, 9, 16 ]
    

    Ví dụ này cho thấy cách lặp qua một tập hợp các đối tượng được thu thập bởi

    const arrayLike = {
      length: 3,
      0: 2,
      1: 3,
      2: 4,
    };
    console.log(Array.prototype.map.call(arrayLike, (x) => x ** 2));
    // [ 4, 9, 16 ]
    
    4. Điều này là do
    const arrayLike = {
      length: 3,
      0: 2,
      1: 3,
      2: 4,
    };
    console.log(Array.prototype.map.call(arrayLike, (x) => x ** 2));
    // [ 4, 9, 16 ]
    
    4 trả về một
    const arrayLike = {
      length: 3,
      0: 2,
      1: 3,
      2: 4,
    };
    console.log(Array.prototype.map.call(arrayLike, (x) => x ** 2));
    // [ 4, 9, 16 ]
    
    6 (là một tập hợp các đối tượng)

    Trong trường hợp này, chúng tôi trả về tất cả các giá trị của

    const arrayLike = {
      length: 3,
      0: 2,
      1: 3,
      2: 4,
    };
    console.log(Array.prototype.map.call(arrayLike, (x) => x ** 2));
    // [ 4, 9, 16 ]
    
    7 đã chọn trên màn hình

    const elems = document.querySelectorAll("select option:checked");
    const values = Array.prototype.map.call(elems, ({ value }) => value);
    

    Một cách dễ dàng hơn sẽ là phương pháp

    const arrayLike = {
      length: 3,
      0: 2,
      1: 3,
      2: 4,
    };
    console.log(Array.prototype.map.call(arrayLike, (x) => x ** 2));
    // [ 4, 9, 16 ]
    
    8

    Một mảng thưa thớt vẫn còn thưa thớt sau

    const numbers = [1, 4, 9];
    const roots = numbers.map((num) => Math.sqrt(num));
    
    // roots is now     [1, 2, 3]
    // numbers is still [1, 4, 9]
    
    2. Chỉ số của các vị trí trống vẫn trống trong mảng được trả về và chức năng gọi lại sẽ không được gọi trên chúng

    console.log(
      [1, , 3].map((x, index) => {
        console.log(`Visit ${index}`);
        return x * 2;
      }),
    );
    // Visit 0
    // Visit 2
    // [2, empty, 6]
    

    (lấy cảm hứng từ bài đăng trên blog này)

    Người ta thường sử dụng gọi lại với một đối số (phần tử được duyệt qua). Một số hàm cũng thường được sử dụng với một đối số, mặc dù chúng có các đối số tùy chọn bổ sung. Những thói quen này có thể dẫn đến những hành vi khó hiểu

    Coi như

    ["1", "2", "3"].map(parseInt);
    

    Trong khi người ta có thể mong đợi _______41_______0, kết quả thực tế là _______41_______1

    const elems = document.querySelectorAll("select option:checked");
    const values = Array.prototype.map.call(elems, ({ value }) => value);
    
    2 thường được sử dụng với một đối số, nhưng có hai đối số. Cái đầu tiên là một biểu thức và cái thứ hai là cơ số của hàm gọi lại,
    const elems = document.querySelectorAll("select option:checked");
    const values = Array.prototype.map.call(elems, ({ value }) => value);
    
    3 chuyển 3 đối số

    • phần tử
    • chỉ số
    • mảng

    Đối số thứ ba bị bỏ qua bởi

    const elems = document.querySelectorAll("select option:checked");
    const values = Array.prototype.map.call(elems, ({ value }) => value);
    
    2—nhưng không phải đối số thứ hai. Đây là nguồn gốc của sự nhầm lẫn có thể

    Dưới đây là một ví dụ ngắn gọn về các bước lặp

    // parseInt(string, radix) -> map(parseInt(value, index))
    /* first iteration  (index is 0): */ parseInt("1", 0); // 1
    /* second iteration (index is 1): */ parseInt("2", 1); // NaN
    /* third iteration  (index is 2): */ parseInt("3", 2); // NaN
    

    Sau đó hãy nói về các giải pháp

    const returnInt = (element) => parseInt(element, 10);
    
    ["1", "2", "3"].map(returnInt); // [1, 2, 3]
    // Actual result is an array of numbers (as expected)
    
    // Same as above, but using the concise arrow function syntax
    ["1", "2", "3"].map((str) => parseInt(str)); // [1, 2, 3]
    
    // A simpler way to achieve the above, while avoiding the "gotcha":
    ["1", "2", "3"].map(Number); // [1, 2, 3]
    
    // But unlike parseInt(), Number() will also return a float or (resolved) exponential notation:
    ["1.1", "2.2e2", "3e300"].map(Number); // [1.1, 220, 3e+300]
    
    // For comparison, if we use parseInt() on the array above:
    ["1.1", "2.2e2", "3e300"].map((str) => parseInt(str)); // [1, 2, 3]
    

    Một đầu ra thay thế của phương thức bản đồ được gọi với tham số

    const elems = document.querySelectorAll("select option:checked");
    const values = Array.prototype.map.call(elems, ({ value }) => value);
    
    2 chạy như sau