HomeLập trìnhJavaScriptCách cắt và...

Cách cắt và ghép các mảng trong JavaScript


.slice().splice() là các phương thức tương tự trong JavaScript. Chúng trông giống nhau, âm thanh giống nhau và chúng làm những việc giống nhau. Vì những lý do đó, điều quan trọng là phải biết sự khác biệt giữa chúng. Ngoài ra, chúng được sử dụng rất thường xuyên, vì vậy việc hiểu cách sử dụng chúng là điều tốt để tìm hiểu sớm đối với bất kỳ nhà phát triển phần mềm nào.

Trong bài viết này, chúng ta sẽ xem xét cách sử dụng chúng với một thử thách kịch bản thuật toán cụ thể. Chúng ta sẽ chèn các phần tử từ mảng này sang mảng khác và trả về mảng kết hợp mà không làm thay đổi mảng ban đầu.

hướng dẫn thuật toán

Bạn được cung cấp hai mảng và một chỉ mục.

Sử dụng các phương thức mảng slicesplice để sao chép từng phần tử của mảng thứ nhất vào mảng thứ hai, theo thứ tự.

Bắt đầu chèn các phần tử vào chỉ mục n của mảng thứ hai.

Trả về mảng kết quả. Các mảng đầu vào sẽ giữ nguyên sau khi chức năng chạy.

function frankenSplice(arr1, arr2, n) {
  return arr2;
}

frankenSplice([1, 2, 3], [4, 5, 6], 1);

Các trường hợp thử nghiệm được cung cấp

  • frankenSplice([1, 2, 3], [4, 5], 1)nên trở lại [4, 1, 2, 3, 5].
  • frankenSplice([1, 2], ["a", "b"], 1)nên trở lại ["a", 1, 2, "b"].
  • frankenSplice(["claw", "tentacle"], ["head", "shoulders", "knees", "toes"], 2)nên trở lại ["head", "shoulders", "claw", "tentacle", "knees", "toes"].
  • Tất cả các phần tử từ mảng đầu tiên phải được thêm vào mảng thứ hai theo thứ tự ban đầu của chúng.
  • Mảng đầu tiên sẽ giữ nguyên sau khi hàm chạy.
  • Mảng thứ hai sẽ giữ nguyên sau khi hàm chạy.

Giải pháp #1: .slice(), .splice() và toán tử trải rộng

PEDAC

Hiểu vấn đề: Chúng tôi có một đầu vào, một chuỗi. Đầu ra của chúng tôi cũng là một chuỗi. Cuối cùng, chúng tôi muốn trả về chuỗi đầu vào với chữ cái đầu tiên — và chỉ chữ cái đầu tiên — của mỗi từ được viết hoa.

Ví dụ/Trường hợp thử nghiệm: Các trường hợp thử nghiệm được cung cấp của chúng tôi cho thấy rằng chúng tôi chỉ nên viết hoa một chữ cái ở đầu mỗi từ. Chúng ta cần viết thường phần còn lại. Các trường hợp thử nghiệm được cung cấp cũng cho thấy rằng chúng tôi không bị ném bất kỳ quả bóng cong nào về các từ ghép kỳ lạ được phân tách bằng ký hiệu thay vì khoảng trắng. Đó là tin tốt cho chúng tôi!

Đọc thêm  Các hàm toán học JavaScript được giải thích

Cấu trúc dữ liệu: Chúng ta sẽ phải chuyển đổi chuỗi đầu vào của mình thành một mảng để thao tác riêng với từng từ.

Hãy trò chuyện một chút về .slice().splice():

Trước tiên hãy giải quyết .slice():

.slice() trích xuất một phần của chuỗi và trả về dưới dạng một chuỗi mới. Nếu bạn gọi .slice() trên một chuỗi mà không chuyển cho nó bất kỳ thông tin bổ sung nào, nó sẽ trả về toàn bộ chuỗi.

"Bastian".slice()
// returns "Bastian"

Điều này sẽ hữu ích cho chúng tôi trong thử thách viết kịch bản thuật toán này vì các hướng dẫn cho chúng tôi biết rằng chúng tôi không nên sửa đổi trực tiếp các mảng đầu vào. Vì vậy, chúng ta sẽ cần tạo một bản sao của một trong số chúng.

Bây giờ chúng ta hãy nhìn vào .splice():

.splice() thay đổi nội dung của một mảng bằng cách loại bỏ hoặc thay thế các phần tử hiện có và/hoặc thêm các phần tử mới.

chúng ta có thể vượt qua .splice() một số đối số xác định nơi bắt đầu xóa, xóa bao nhiêu và những gì được chèn vào. start là một con số cho biết .splice() tại chỉ mục nào để bắt đầu xóa các phần tử. deleteCount kể .splice() có bao nhiêu yếu tố để xóa.

Đợi một chút! Nếu bạn không muốn xóa bất cứ thứ gì thì sao? Nếu bạn chỉ muốn chèn các phần tử thì sao? Tốt rồi. Chỉ cần đặt deleteCount về không. Bây giờ chúng ta có thể bắt đầu thêm các mục. Chỉ cần tách từng phần tử bằng dấu phẩy, như vậy item1, item2, item3, item4.

.splice(start, deleteCount, item1, item2, item3, etc.)

Một khái niệm khác cần ghi nhớ cho thử thách viết kịch bản thuật toán này là toán tử trải rộng. ES6 đã tặng chúng tôi toán tử trải rộng trông giống như hình elip – chỉ ba dấu chấm liên tiếp.

Toán tử trải rộng được sử dụng phổ biến nhất khi bạn muốn sử dụng các phần tử của một mảng làm đối số cho một hàm. Đó chính xác là những gì chúng ta sẽ làm với nó trong thử thách này. Chúng tôi không muốn chèn toàn bộ mảng arr1 vào trong arr2. Chúng tôi muốn chèn từng phần tử của arr1 vào trong arr2.

thuật toán:

  1. Tạo một bản sao của arr2.
  2. Chèn tất cả các phần tử của arr1 vào trong arr2 bắt đầu từ chỉ mục trong arr2 theo quy định của n.
  3. Trả về các mảng kết hợp.
Đọc thêm  Toán tử `in` trong JavaScript được giải thích bằng các ví dụ

Mã số: Xem bên dưới!

function frankenSplice(arr1, arr2, n) {
  // Create a copy of arr2.
  let combinedArrays = arr2.slice()
  //                   [4, 5, 6]

  // Insert all the elements of arr1 into arr2 beginning
  // at the index specified by n. We're using the spread
  // operator "..." to insert each individual element of 
  // arr1 instead of the whole array.
  combinedArrays.splice(n, 0, ...arr1)
  //                   (1, 0, ...[1, 2, 3])
  //                   [4, 1, 2, 3, 5, 6]

  // Return the combined arrays.
  return combinedArrays
}

frankenSplice([1, 2, 3], [4, 5, 6], 1);

Không có ý kiến:

function frankenSplice(arr1, arr2, n) {
  let combinedArrays = arr2.slice()
  combinedArrays.splice(n, 0, ...arr1)
  return combinedArrays
}

frankenSplice([1, 2, 3], [4, 5, 6], 1);

Giải pháp #2: .slice(), .splice() và vòng lặp for

PEDAC

Hiểu vấn đề: Chúng tôi có một đầu vào, một chuỗi. Đầu ra của chúng tôi cũng là một chuỗi. Cuối cùng, chúng tôi muốn trả về chuỗi đầu vào với chữ cái đầu tiên — và chỉ chữ cái đầu tiên — của mỗi từ được viết hoa.

Ví dụ/Trường hợp thử nghiệm: Các trường hợp thử nghiệm được cung cấp của chúng tôi cho thấy rằng chúng tôi chỉ nên viết hoa một chữ cái ở đầu mỗi từ. Chúng ta cần viết thường phần còn lại. Các trường hợp thử nghiệm được cung cấp cũng cho thấy rằng chúng tôi không bị ném bất kỳ quả bóng cong nào về các từ ghép kỳ lạ được phân tách bằng ký hiệu thay vì khoảng trắng. Đó là tin tốt cho chúng tôi!

Cấu trúc dữ liệu: Chúng ta sẽ phải chuyển đổi chuỗi đầu vào của mình thành một mảng để thao tác riêng với từng từ.

Hãy trò chuyện một chút về .slice().splice():

Trước tiên hãy giải quyết .slice():

.slice() trích xuất một phần của chuỗi và trả về dưới dạng một chuỗi mới. Nếu bạn gọi .slice() trên một chuỗi mà không chuyển cho nó bất kỳ thông tin bổ sung nào, nó sẽ trả về toàn bộ chuỗi.

"Bastian".slice()
// returns "Bastian"

Điều này sẽ hữu ích cho chúng tôi trong thử thách viết kịch bản thuật toán này vì các hướng dẫn cho chúng tôi biết rằng chúng tôi không nên sửa đổi trực tiếp các mảng đầu vào. Vì vậy, chúng ta sẽ cần tạo một bản sao của một trong số chúng.

Bây giờ chúng ta hãy nhìn vào .splice():

.splice() thay đổi nội dung của một mảng bằng cách loại bỏ hoặc thay thế các phần tử hiện có và/hoặc thêm các phần tử mới.

Đọc thêm  JavaScript 正则表达式和 replace() 方法使用示例

chúng ta có thể vượt qua .splice() một số đối số xác định nơi bắt đầu xóa, xóa bao nhiêu và những gì được chèn vào. start là một con số cho biết .splice() tại chỉ mục nào để bắt đầu xóa các phần tử. deleteCount kể .splice() có bao nhiêu yếu tố để xóa. Đợi một chút! Nếu bạn không muốn xóa bất cứ thứ gì thì sao? Nếu bạn chỉ muốn chèn các phần tử thì sao? Tốt rồi. Chỉ cần đặt deleteCount về không. Bây giờ chúng ta có thể bắt đầu thêm các mục. Chỉ cần tách từng phần tử bằng dấu phẩy, như vậy item1, item2, item3, item4.

.splice(start, deleteCount, item1, item2, item3, etc.)

Không giống như trong giải pháp trước, chúng tôi sẽ không sử dụng toán tử trải rộng ở đây. Thay vào đó, chúng ta sẽ sử dụng vòng lặp for để lấy từng phần tử một từ arr1 và chèn chúng vào arr2.

Bí quyết ở đây là tăng n bằng 1 mỗi khi vòng lặp chạy nếu không các phần tử của arr1 sẽ không kết thúc theo đúng thứ tự khi được chèn vào arr2.

thuật toán:

  1. Tạo một bản sao của arr2.
  2. Sử dụng vòng lặp for, chèn từng phần tử của arr1 vào trong arr2 bắt đầu từ chỉ mục n.
  3. Tăng n bằng 1 mỗi khi vòng lặp chạy.
  4. Trả về các mảng kết hợp.

Mã số: Xem bên dưới!

function frankenSplice(arr1, arr2, n) {
  // Create a copy of arr2.
  let combinedArrays = arr2.slice()
  // Using a for loop, insert each element of arr1
  // into combinedArrays starting at index n.
  for (let i = 0; i < arr1.length; i++) {
      combinedArrays.splice(n, 0, arr1[i])
  //       [4, 5, 6].splice(1, 0, 1)
  //    [4, 1, 5, 6].splice(2, 0, 2)
  // [4, 1, 2, 5, 6].splice(3, 0, 3)
  // [4, 1, 2, 3, 5, 6]

  //  increment n by 1 each time the loop runs
      n++
  }
  // Return the combined arrays.
  return combinedArrays
}

frankenSplice([1, 2, 3], [4, 5, 6], 1);

Không có ý kiến:

function frankenSplice(arr1, arr2, n) {
  let combinedArrays = arr2.slice()
  for (let i = 0; i < arr1.length; i++) {
    combinedArrays.splice(n, 0, arr1[i])
    n++
  }
  return combinedArrays
}

frankenSplice([1, 2, 3], [4, 5, 6], 1);

Nếu bạn có các giải pháp và/hoặc đề xuất khác, vui lòng chia sẻ trong phần bình luận!

Bài viết này là một phần của loạt bài FreeCodeCamp Algorithm Scripting.

Bài viết này tham khảo FreeCodeCamp Basic Algorithm Scripting: Slice and Splice

Bạn có thể theo dõi tôi trên Medium, LinkedIn và GitHub!



Zik.vn – Biên dịch & Biên soạn Lại

spot_img

Create a website from scratch

Just drag and drop elements in a page to get started with Newspaper Theme.

Buy Now ⟶

Bài viết liên quang

DMCA.com Protection Status